: * 它的显示格式由**浏览器 UI 语言 / 系统时间格式**决定, 与元素 lang * 都压不过它。中文环境实测会渲染成「下午 03:30」,用户很容易把上下午填反; * 而且它只有时:分,**没有秒**。拆成「原生日期选择器 + 三个下拉」后, * 24 小时制与"精确到秒"都由控件本身保证,浏览器改不掉。 * * 日期部分仍是原生 ``(app.js 里的 showPicker 脚本对它同样生效, * 点输入框任意位置都能弹出日历 —— 这正是"整个输入框点击都可以弹出"的落点)。 * * 用法(include 前 set 好这些变量;模板里只读它们): * $dtName 字段基名,如 'birthday_solar' → 产出 *_date / _hour / _minute / _second * $dtValue 可空;'Y-m-d H:i:s' / 'Y-m-d H:i' / 'Y-m-d'。服务端用 read_dt_input($dtName) 取值 * $dtRequired 日期是否必填(默认 false) * $dtId 可选;日期控件的 id(供 ) * $dtSeconds 是否要"秒"这一档(默认 true;生日要精确到时分秒) */ $dtName = (string)($dtName ?? 'time'); $dtValue = $dtValue ?? null; $dtRequired = (bool)($dtRequired ?? false); $dtId = (string)($dtId ?? ''); $dtSeconds = (bool)($dtSeconds ?? true); // ⚠️⚠️ 临时变量**一律带 dt 前缀**,一个都不能漏:这里原来写成 // `$t = strtotime(...)`,把宿主模板里表示「这条任务 / 这条记录」的 `$t` // 覆盖成了 int —— 于是 include 之后凡是读 `$t['id']`、`$t['status']` 的地方 // 全部拿到 null,子任务列表空、评论不渲染、@高亮消失,而且**不报任何错** // (PHP 8 对 "Trying to access array offset on value of type int" 只 Warning)。 // tasks/show.php 上就是这么被 e2e 抓到的(2026-10-02)。 $dtTs = (!empty($dtValue) && ($dtTsTmp = strtotime(trim((string)$dtValue)))) ? $dtTsTmp : 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; $dtSec = $dtTs ? (int)date('s', $dtTs) : 0; ?> value="= e($dtDate) ?>"= $dtRequired ? ' required' : '' ?> aria-label="日期"> >= $hv ?> : >= $mv ?> : >= $sv ?>