PHP将未知日期时间字符串转换为datetime对象

时间:2016-05-11 20:23:42

标签: php datetime type-conversion iso8601

我遇到以下字符串时遇到问题,该字符串应该是日期时间(来自api的响应)。

  

2013-03-08T19:11:11.234 + 0000

我需要将字符串转换为ISO 8601。 确切的格式应如下所示:

  

2016-03-01T12:00:00 + 00:00

如果有人可以帮助我在PHP中做这件事会很棒但如果有人能够识别格式(如yyyy-mm-ddThh:mm:ss),我会非常高兴。

2 个答案:

答案 0 :(得分:3)

似乎API以毫秒为单位返回时间。

试试这个:

$date = '2013-03-08T19:11:11.234+0000';
$format = 'Y-m-d\TH:i:s.uO';

$dt = DateTime::createFromFormat($format, $date);
echo $dt->format(DateTime::ISO8601);

结果:

2013-03-08T19:11:11+0000

修改

根据您对答案的评论,您需要转换这样的时间:

2016-03-01T11:01:51.126044 00:00

由于无法使用DateTime解析此格式,因此您需要先将其设为可读。

有很多方法可以做到这一点。我们需要的是在时区之前添加+,以便我的代码可以正常工作。

如果您确定从API获得的日期始终此格式,并且始终在字符串中只有1个空格,则只需替换字符串有空格:

$date = '2016-03-01T11:01:51.126044 00:00';
str_replace(' ', '+', $date);

$format = 'Y-m-d\TH:i:s.uP';

$dt = DateTime::createFromFormat($format, $date);
echo $dt->format(DateTime::ISO8601);

这应该有用(请注意,这里的时区掩码为P,因为有冒号)

如果您不需要计算日期,也可以使用preg_replace()代替DateTime:

$date = '2016-03-01T11:01:51.126044 00:00';
$date = preg_replace('`(\.[0-9]+\s)`', '+', $date);
echo $date;

这会产生:

2016-03-01T11:01:51+00:00

如果您需要计算日期,只需将其转换为DateTime:

$date = '2016-03-01T11:01:51.126044 00:00';
$date = preg_replace('`(\.[0-9]+\s)`', '+', $date);
$date = DateTime::createFromFormat(DateTime::ISO8601, $date);
var_dump($date);

这会产生:

object(DateTime)#1 (3) {
  ["date"]=>
  string(26) "2016-03-01 11:01:51.000000"
  ["timezone_type"]=>
  int(1)
  ["timezone"]=>
  string(6) "+00:00"
}

答案 1 :(得分:1)

我建议你使用Carbon:http://carbon.nesbot.com/docs/

echo Carbon::parse('2013-03-08T19:11:11.234+0000')->toAtomString();

此外,您想要的格式是ATOM,而不是ISO 8601.您可以使用@Arcesilas方式,也可以使用它。