如何使用破碎格式的createFromDate从String创建日期

时间:2016-01-14 13:36:36

标签: php datetime

我尝试使用DateTime::createFromFormat()将字符串解析为日期,以避免在使用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);

所以问题是,我如何从这个时区的差异中划分出时区,或者如果不可能的话。然后我需要一种方法来处理它。

3 个答案:

答案 0 :(得分:2)

问题基本上是字符串UTC+1的一部分......但是,它与Etc/GMT+1的有效TimeZone格式相差不远,所以应该可以重新映射它。

快速简便的方法就是取代' 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'

答案 1 :(得分:0)

<input type="date">

用户被迫使用正确的格式。然而它是mm-dd-yyyy。在欧洲,我们更喜欢第一天。

答案 2 :(得分:0)

嗯,那个日期格式很奇怪。

以下是使用str_replace()

的非常简单的修复方法

切断&#34; UTC&#34;,留下&#34; + 1&#34; - 这应该被&#34; e&#34;或&#34; P&#34;。

<强>来源

<?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