You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP日期格式转换问题:RFID设备传入日期转MySQL DATETIME格式

解决PHP中旧RFID日期字符串转MySQL DATETIME格式的问题

我来帮你搞定这个日期转换的麻烦!你的问题核心是传入的日期格式(日/月/年 时:分:秒:毫秒)和目标格式(年-月-日 时:分:秒)不匹配,而且DateTime::createFromFormat的格式符没写对,导致解析失败。

问题分析

你拿到的字符串是"30/3/2020 17:7:23:847",结构是:

  • 日期部分:日/月/年(日是两位,月是一位)
  • 时间部分:时:分:秒:毫秒(时两位,分一位,秒两位,毫秒三位)

之前报错大概率是因为格式符没有完全匹配这个结构,尤其是没处理末尾的毫秒部分,或者用了不兼容的格式符。

解决方案

直接用DateTime::createFromFormat指定精确的解析格式,再转换成MySQL需要的格式即可,代码如下:

$passedTime = "30/3/2020 17:7:23:847";

// 第一步:按照输入格式解析日期
// 格式符说明:
// d = 两位日(如30),m = 一位/两位月(如3),Y = 四位年
// H = 24小时制的两位小时(如17),i = 一位/两位分钟(如7),s = 两位秒(如23)
// u = 微秒(这里的847毫秒会被识别为000847微秒,不影响后续转换)
$dateObj = DateTime::createFromFormat('d/m/Y H:i:s:u', $passedTime);

if ($dateObj) {
    // 第二步:格式化为MySQL DATETIME支持的格式
    // 格式符说明:
    // Y = 四位年,n = 一位/两位月,j = 一位/两位日
    // H:i:s = 24小时制的时:分:秒(自动补前导零,比如7分会变成07)
    $convertedPassedTime = $dateObj->format('Y-n-j H:i:s');
    echo $convertedPassedTime; // 输出:2020-3-30 17:07:23
} else {
    // 处理解析失败的情况(比如数据源格式意外变化)
    trigger_error("无法解析传入的日期字符串", E_USER_WARNING);
}

关键注意事项

  1. 必须精确匹配格式符:createFromFormat的格式符要和输入字符串的每一部分完全对应,包括分隔符(/、:)和毫秒部分的u,否则会解析失败。
  2. 自动补前导零:用i解析分钟时,即使输入是7,后续用H:i:s格式化会自动补成07,刚好符合MySQL DATETIME的要求。
  3. 错误处理:一定要判断createFromFormat的返回值,避免后续代码因为无效日期报错。

内容的提问来源于stack exchange,提问作者plumby101

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 16:43:01