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!

请改用 Hi。此外,您不能回显对象,而是使用 print_r

Try with an example

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