如何使用从损坏的格式使用创建从日期创建日期


How to create a date from a String by using createFromDate from a broken format

我尝试使用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">

用户被迫使用正确的格式。然而,它是月-日-年。在欧洲,我们更喜欢先一天。