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); }
关键注意事项
- 必须精确匹配格式符:
createFromFormat的格式符要和输入字符串的每一部分完全对应,包括分隔符(/、:)和毫秒部分的u,否则会解析失败。 - 自动补前导零:用
i解析分钟时,即使输入是7,后续用H:i:s格式化会自动补成07,刚好符合MySQL DATETIME的要求。 - 错误处理:一定要判断
createFromFormat的返回值,避免后续代码因为无效日期报错。
内容的提问来源于stack exchange,提问作者plumby101
相关产品推荐
相关产品推荐

