我想为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
如何正确解析这些日期?
kyxcudwk1#
如果您的目标是修复数据,因为您的任务是使用有缺陷的数据,那么您可以使用正则表达式来删除任何错误或不需要的AM或PM子字符串。代码:(Demo)
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
0sgqnhkj2#
这是因为strtotime("March 23 2022 00:20 AM")返回FALSE,因为它是一个无效的日期,正如OMi Shah指出的那样。显然FALSE被date()函数计算为0,尝试打印date('Y-m-d H:i:s', FALSE);,并亲自查看,它将打印1970-01-01 03:00:00与date('Y-m-d H:i:s', 0);相同
strtotime("March 23 2022 00:20 AM")
FALSE
date()
0
date('Y-m-d H:i:s', FALSE);
1970-01-01 03:00:00
date('Y-m-d H:i:s', 0);
qacovj5a3#
如果您的日期无效,则需要执行错误检查:
$unixTime = strtotime('March 23 2022 00:20 AM'); if ($unixTime === false) { // Report error } else { $normalizedString = date('Y-m-d H:i:s', $unixTime); }
日期解析函数通常过于宽松(例如,strtotime('PDT')生成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
3条答案
按热度按时间kyxcudwk1#
如果您的目标是修复数据,因为您的任务是使用有缺陷的数据,那么您可以使用正则表达式来删除任何错误或不需要的
AM
或PM
子字符串。代码:(Demo)
输出:
0sgqnhkj2#
这是因为
strtotime("March 23 2022 00:20 AM")
返回FALSE,因为它是一个无效的日期,正如OMi Shah指出的那样。显然FALSE
被date()
函数计算为0
,尝试打印date('Y-m-d H:i:s', FALSE);
,并亲自查看,它将打印1970-01-01 03:00:00
与date('Y-m-d H:i:s', 0);
相同qacovj5a3#
如果您的日期无效,则需要执行错误检查:
日期解析函数通常过于宽松(例如,
strtotime('PDT')
生成PDT时区的当前时间),因此转换回原始格式并查看是否得到相同的值也无妨。您可能还希望修复错误,但这在很大程度上取决于错误的外观以及您想要的解决方案: