createFromFormat 给我错误的结果
createFromFormat giving me wrong results
我想将日期格式从 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
已编辑
现在使用建议的格式
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!
请改用 H
和 i
。此外,您不能回显对象,而是使用 print_r
。
H
for 24 hour format.
i
for Minutes with leading zeros
将此更改为:
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");
请试试这个
$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');
解释为什么这会给你这些结果:
您的日期格式字符串包含两次 m
,第二次是读取时间的 "minutes" 部分。这将覆盖之前正确的月份值。由于您的第一个字符串 (19/07/2017 00:00:00
) 的分钟数为零,因此您的 DateTime
对象被初始化为“第 0”个月 - 在 PHP 中,这会导致日期回滚一个月进入前一年,所以您看到的是 2016 年 12 月。
您的第二个字符串 (20/07/2017 22:51:17
) 失败,因为您正在使用 h
解析 24 小时制 - 解析任何大于 12 的数字时都会失败。
如其他答案中所述,用于这些日期的正确格式字符串是 d/m/Y H:i:s
。
我想将日期格式从 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
已编辑 现在使用建议的格式
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!
请改用 H
和 i
。此外,您不能回显对象,而是使用 print_r
。
H
for 24 hour format.
i
for Minutes with leading zeros
将此更改为:
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");
请试试这个
$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');
解释为什么这会给你这些结果:
您的日期格式字符串包含两次 m
,第二次是读取时间的 "minutes" 部分。这将覆盖之前正确的月份值。由于您的第一个字符串 (19/07/2017 00:00:00
) 的分钟数为零,因此您的 DateTime
对象被初始化为“第 0”个月 - 在 PHP 中,这会导致日期回滚一个月进入前一年,所以您看到的是 2016 年 12 月。
您的第二个字符串 (20/07/2017 22:51:17
) 失败,因为您正在使用 h
解析 24 小时制 - 解析任何大于 12 的数字时都会失败。
如其他答案中所述,用于这些日期的正确格式字符串是 d/m/Y H:i:s
。