提问人:Dumitru 提问时间:4/14/2023 最后编辑:mickmackusaDumitru 更新时间:4/15/2023 访问量:78
strtotime() 无法解析 datetime 字符串中的“00:20 AM”
strtotime() fails to parse "00:20 AM" in datetime string
问:
我想格式化 SQL 的日期,但我得到一个意外的结果:
echo date('Y-m-d H:i:s', strtotime("February 13 2022 10:08 PM")); //2022-02-13 22:08:00
echo date('Y-m-d H:i:s', strtotime("March 23 2022 00:20 AM")); //1970-01-01 00:00:00
如何正确解析这些日期?
答:
1赞
Michael G
4/14/2023
#1
这是因为返回 FALSE,因为正如 OMi Shah 指出的那样,这是一个无效的日期。显然被评估为按功能,尝试打印并自己查看,它会打印与strtotime("March 23 2022 00:20 AM")
FALSE
0
date()
date('Y-m-d H:i:s', FALSE);
1970-01-01 03:00:00
date('Y-m-d H:i:s', 0);
1赞
Álvaro González
4/15/2023
#2
如果日期无效,则需要进行错误检查:
$unixTime = strtotime('March 23 2022 00:20 AM');
if ($unixTime === false) {
// Report error
} else {
$normalizedString = date('Y-m-d H:i:s', $unixTime);
}
日期解析函数通常过于宽松(例如,在 PDT 时区中生成当前时间),因此转换回原始格式并查看是否获得相同的值也没有什么坏处。strtotime('PDT')
您可能还想修复错误,但这在很大程度上取决于错误的外观以及您想要的分辨率:
'March 23 2022 00:20 AM' // Replace 00:... AM dates with valid representation
'February 31 2023 09:55 PM' // Make it March 3? Throw error?
'(no data)' // Nothing fixable here
2赞
mickmackusa
4/15/2023
#3
如果目标是修复数据,因为您的任务是使用有缺陷的数据,则可以使用正则表达式来切断任何犯规或不需要的子字符串。AM
PM
代码:(演示)
$tests = [
"February 13 2022 10:08 PM",
"March 23 2022 00:20 AM",
"April 3 2022 11:20 PM",
"May 28 2022 12:20 AM",
"June 12 2022 21:20 PM",
"July 4 2022 13:20 AM",
];
$tests = preg_replace(
[
'/(?:0\d|1[01]):\d{2}\K AM/', // 00:00 through 11:59 do not need AM
'/(?:2\d|1[3-9]):\d{2}\K [AP]M/', // 13:00 through 23:59 do not need AM or PM
],
'',
$tests
);
var_export($tests);
foreach ($tests as $test) {
echo "\n" . date('Y-m-d H:i:s', strtotime($test));
}
输出:
array (
0 => 'February 13 2022 10:08 PM',
1 => 'March 23 2022 00:20',
2 => 'April 3 2022 11:20 PM',
3 => 'May 28 2022 12:20 AM',
4 => 'June 12 2022 21:20',
5 => 'July 4 2022 13:20',
)
2022-02-13 22:08:00
2022-03-23 00:20:00
2022-04-03 23:20:00
2022-05-28 00:20:00
2022-06-12 21:20:00
2022-07-04 13:20:00
评论
12:20 AM
00:20 AM