我想将日期格式从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!
答案 0 :(得分:1)
改为使用H
和i
。此外,您无法使用print_r
回显对象。
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
。