45 lines
2.6 KiB
PHP
45 lines
2.6 KiB
PHP
<?php
|
||||
|
|
/**
|
|||
|
|
* 「日期 + 24 小时制时:分」组合输入控件。
|
|||
|
|
*
|
|||
|
|
* ⚠️ 为什么不用 <input type="datetime-local">:它的显示格式由**浏览器 UI 语言 /
|
|||
|
|
* 系统时间格式**决定,<html lang> 与元素 lang 都压不过它(实测 chromium 1243:
|
|||
|
|
* --lang=zh-CN 渲染成「下午 03:30」,用户会混淆;--lang=en-GB 才是 24 小时制)。
|
|||
|
|
* 拆成「原生日期选择器 + 时/分两个下拉」后,24 小时制由控件本身决定,浏览器改不掉。
|
|||
|
|
* 日期部分仍是原生 date 控件(layout.php 里的 showPicker 全局脚本对它同样生效,
|
|||
|
|
* 点输入框任意位置都能弹出日历)。
|
|||
|
|
*
|
|||
|
|
* 调用方式:include 前 set 好这几个变量(模板里只有它们会被读):
|
|||
|
|
* $dtName 字段基名,如 'start_time' → 产出 *_date / *_hour / *_minute 三个字段
|
|||
|
|
* $dtValue 可空;"Y-m-d H:i:s" / "Y-m-d H:i" / null。服务端取值用 read_dt_input($dtName)
|
|||
|
|
* $dtRequired 日期是否必填(默认 false;必填时在日期控件上加 required)
|
|||
|
|
* $dtId 可选;给日期控件的 id(供 <label for>)
|
|||
|
|
*/
|
|||
|
|
$dtName = (string)($dtName ?? 'time');
|
|||
|
|
$dtValue = $dtValue ?? null;
|
|||
|
|
$dtRequired = (bool)($dtRequired ?? false);
|
|||
|
|
$dtId = (string)($dtId ?? '');
|
|||
|
|
|
|||
|
|
$dtTs = (!empty($dtValue) && ($t = strtotime((string)$dtValue))) ? $t : false;
|
|||
|
|
$dtDate = $dtTs ? date('Y-m-d', $dtTs) : '';
|
|||
|
|
$dtHour = $dtTs ? (int)date('G', $dtTs) : 0; // G = 0..23,天然 24 小时制
|
|||
|
|
$dtMin = $dtTs ? (int)date('i', $dtTs) : 0;
|
|||
|
|
?>
|
|||
|
|
<div class="dt-input">
|
|||
|
|
<input type="date" class="dt-date" name="<?= e($dtName) ?>_date"<?= $dtId !== '' ? ' id="' . e($dtId) . '"' : '' ?>
|
|||
|
|
value="<?= e($dtDate) ?>"<?= $dtRequired ? ' required' : '' ?>
|
|||
|
|
aria-label="日期">
|
|||
|
|
<select class="dt-hour" name="<?= e($dtName) ?>_hour" aria-label="时(24 小时制)">
|
|||
|
|
<?php for ($h = 0; $h < 24; $h++): $hv = sprintf('%02d', $h); ?>
|
|||
|
|
<option value="<?= $hv ?>"<?= $h === $dtHour ? ' selected' : '' ?>><?= $hv ?></option>
|
|||
|
|
<?php endfor; ?>
|
|||
|
|
</select>
|
|||
|
|
<span class="dt-colon" aria-hidden="true">:</span>
|
|||
|
|
<select class="dt-minute" name="<?= e($dtName) ?>_minute" aria-label="分">
|
|||
|
|
<?php for ($m = 0; $m < 60; $m++): $mv = sprintf('%02d', $m); ?>
|
|||
|
|
<option value="<?= $mv ?>"<?= $m === $dtMin ? ' selected' : '' ?>><?= $mv ?></option>
|
|||
|
|
<?php endfor; ?>
|
|||
|
|
</select>
|
|||
|
|
</div>
|
|||
|
|
<?php /* 用完即清,避免残留的 $dtName 影响下一次 include */ unset($dtName, $dtValue, $dtRequired, $dtId, $dtTs, $dtDate, $dtHour, $dtMin); ?>
|