createFromFormat给我错误的结果

时间:2017-11-08 10:11:18

标签: php date date-format

我想将日期格式从d / m / Y转换为Y-m-d,并带有时区偏移量。我可以使用以下代码将d / m / Y转换为Y-m-d:

$date = DateTime::createFromFormat('d/m/Y', $date);
$date = $date->format('Y-m-d');

这在某种程度上有效,但是当我遇到这样的日期时:

echo DateTime::createFromFormat('d/m/Y h:m:s', '19/07/2017 00:00:00');
results is 2016-12-19 00:00:00.000000
echo DateTime::createFromFormat('d/m/Y h:m:s', '20/07/2017 22:51:17');
results is false

EDITED 现在使用建议的格式

DateTime::createFromFormat('d/m/Y H:i:s', '19/07/2017 00:00:00');

预期结果:

06/06/2017 00:00:00 => 2017-06-06 00:00:00.000000
06/06/2017 12:31:34 => 2017-06-06 12:31:34.000000
08/06/2017 21:59:21 => 2017-08-06 21:59:21.000000
19/07/2017 00:00:00 => 2018-07-07 00:00:00.000000 wrong!
20/07/2017 22:51:17 => 2018-08-07 22:51:17.000000 wrong!
21/07/2017 23:39:23 => 2018-09-07 23:39:23.000000 wrong!
27/07/2017 02:46:14 => 2019-03-07 02:46:14.000000 wrong!

3 个答案:

答案 0 :(得分:1)

改为使用Hi。此外,您无法使用print_r回显对象。

Try with an example

  

H 24小时格式。

     

i表示带有前导零的分钟

将其更改为:

echo DateTime::createFromFormat('d/m/Y h:m:s', '19/07/2017 00:00:00');

:此:

print_r(DateTime::createFromFormat('d/m/Y H:i:s', '19/07/2017 00:00:00'));

获取特定格式

$dateObject=DateTime::createFromFormat('d/m/Y H:i:s', '19/07/2017 00:00:00');
echo $dateObject->format("Y-m-d H:i:s");

答案 1 :(得分:0)

请试试这个

$date = DateTime::createFromFormat('d/m/Y H:i:s', '20/07/2017 22:51:17');
echo date_format($date, 'Y-m-d H:i:s');

答案 2 :(得分:0)

解释为什么这会给你带来这些结果:

您的日期格式字符串包含m两次,其中第二个字符串正在读取"分钟"部分时间。这会覆盖之前正确的月份值。由于您的第一个字符串(19/07/2017 00:00:00)的分钟数为零,因此您的DateTime对象正在初始化为" 0th"月 - 在PHP中,这导致日期回滚到前一年一个月,所以你将在2016年12月看到。

您的第二个字符串(20/07/2017 22:51:17)失败,因为您正在使用h解析24小时时间 - 解析任何高于12的数字时都会失败。

如其他答案所述,用于这些日期的正确格式字符串为d/m/Y H:i:s