我尝试使用DateTime::createFromFormat()将字符串解析为Date,以避免使用strtotime()时可能发生的几个本地问题。
字符串如下所示:"2016-01-14 00:16:18 UTC+1"
所以我正在寻找一个映射给定日期的格式字符串。到目前为止,我已经尝试了以下格式,但它们不起作用。
$str = '2016-01-14 00:16:18 UTC+1';
$d = DateTime::createFromFormat('Y-m-d H:i:s e', $str);
$d = DateTime::createFromFormat('Y-m-d H:i:s eO', $str);
$d = DateTime::createFromFormat('Y-m-d H:i:s eP', $str);
$d = DateTime::createFromFormat('Y-m-d H:i:s T', $str);
$d = DateTime::createFromFormat('Y-m-d H:i:s TO', $str);
$d = DateTime::createFromFormat('Y-m-d H:i:s TP', $str);
所以问题是,我如何将时区与这个时区的差异分开,或者如果不可能。然后我需要一种方法来处理它。
问题基本上是字符串UTC+1
的一部分...但是,这与Etc/GMT+1
的有效时区格式相差不远,因此应该可以重新映射它。
快速简便的方法是将"UTC"替换为"GMT":
$d = DateTime::createFromFormat('Y-m-d H:i:s e', str_replace('UTC', 'GMT', $str));
然后,字符串变为 2016-01-14 00:16:18 GMT+1,这是有效的,您将获得一个工作DateTime
对象。您可以使用以下内容进行测试:
echo $d->format('Y-m-d H:i:s e')
// prints '2016-01-14 00:16:18 +01:00'
嗯,那个日期格式很奇怪。
这是一个非常简单的修复程序,使用 str_replace()
,
它删除了"UTC",留下"+1" - 这应该被"e"或"P"识别。
源
<?php
$str = '2016-01-14 00:16:18 UTC+1';
$str = str_replace('UTC', '', $str); // fix odd date string
$format = 'Y-m-d H:i:s P';
$date = DateTime::createFromFormat($format, $str);
var_dump($date);
echo $date->format('Y-m-d H:i:s');
结果
object(DateTime)[1]
public 'date' => string '2016-01-14 00:16:18.000000' (length=26)
public 'timezone_type' => int 1
public 'timezone' => string '+01:00' (length=6)
2016-01-14 00:16:18
<input type="date">
用户被迫使用正确的格式。然而,它是月-日-年。在欧洲,我们更喜欢先一天。