PHP 将未知日期时间字符串转换为日期时间对象
PHP converting unknown datetime string to datetime object
我遇到了以下字符串的问题,它应该是日期时间(来自 api 的响应)。
2013-03-08T19:11:11.234+0000
我需要将字符串转换为 ISO 8601。
确切的格式应如下所示:
2016-03-01T12:00:00+00:00
如果有人可以在 php 中帮助我做到这一点,那就太好了,但如果有人可以识别格式(例如 yyyy-mm-ddThh:mm:ss
),我会非常高兴。
好像APIreturns时间是毫秒级的
试试这个:
$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得到的日期是always这种格式,那么就会always字符串中只有 1 个 space,只需将字符串替换为 space:
$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 的方式进行操作,它应该也可以。
我遇到了以下字符串的问题,它应该是日期时间(来自 api 的响应)。
2013-03-08T19:11:11.234+0000
我需要将字符串转换为 ISO 8601。 确切的格式应如下所示:
2016-03-01T12:00:00+00:00
如果有人可以在 php 中帮助我做到这一点,那就太好了,但如果有人可以识别格式(例如 yyyy-mm-ddThh:mm:ss
),我会非常高兴。
好像APIreturns时间是毫秒级的
试试这个:
$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得到的日期是always这种格式,那么就会always字符串中只有 1 个 space,只需将字符串替换为 space:
$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 的方式进行操作,它应该也可以。