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


PHP converting unknown datetime string to datetime object

我遇到了以下字符串的问题,该字符串应该是datetime(来自api的响应)。

2013-03-08T19:11.234+0000

我需要将字符串转换为ISO8601。确切的格式应该是:

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

如果有人能在php中帮我做这件事,那就太好了,但如果有人能够识别格式(比如yyyy-mm-ddThh:mm:ss),我已经非常高兴了。

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获得的日期是始终此格式,并且字符串中只有总是一个空格,请将字符串替换为空格:

$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"
}

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

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

此外,您需要的格式是ATOM,而不是ISO 8601。你可以用@Arcesilas的方式,它也应该有效。