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
编辑
根据你回答的cmets,你需要换算这样的时间:
2016-03-01T11:01:51.126044 00:00
由于无法使用 DateTime 解析这种格式,因此您需要先使其可读。
有很多方法可以做到这一点。我们需要的是在时区之前添加一个+,这样我上面的代码就可以工作了。
如果您确定从 API 获得的日期是 always 这种格式,并且字符串中将 always 只有 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"
}