【问题标题】:PHP converting unknown datetime string to datetime objectPHP将未知的日期时间字符串转换为日期时间对象
【发布时间】:2016-09-07 10:39:15
【问题描述】:

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

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

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

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

如果有人可以帮助我在 php 中执行此操作,那就太好了,但如果有人能识别格式(如 yyyy-mm-ddThh:mm:ss),我已经非常高兴了。

【问题讨论】:

    标签: php datetime type-conversion iso8601


    【解决方案1】:

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

    【讨论】:

    • 非常感谢 Arcesilas。你无法想象这有多大帮助。
    【解决方案2】:

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

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

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

    【讨论】:

    • 碳非常好,但我觉得在这种情况下有点重。顺便说一句,使用 Carbon,您也可以使用 format(DateTime::ISO8601)
    • 我试过但最终得到:致命错误:未捕获的异常 'Exception' 带有消息 'DateTime::__construct():无法在位置 0 ($) 解析时间字符串 ($var):意外/var/www/html/carbon.php:237 中的字符' 堆栈跟踪:#0 /var/www/html/carbon.php(237): DateTime->__construct('$var', Object(DateTimeZone)) # 1 /var/www/html/carbon.php(270): Carbon\Carbon->__construct('$var', NULL) #2 /var/www/html/scopearea.php(118): Carbon\Carbon:: parse('$var') #3 {main} 在第 237 行的 /var/www/html/carbon.php 中抛出 .. 谢谢
    猜你喜欢
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 2015-09-17
    • 2011-10-03
    • 2017-08-04
    • 2014-12-13
    相关资源
    最近更新 更多