【问题标题】:Issue with DateTime CreateFromFormat using RFC3339使用 RFC3339 的 DateTime CreateFromFormat 问题
【发布时间】:2021-08-25 12:13:00
【问题描述】:

我有这个日期时间戳:

"2021-06-08T13:09:00.9796129Z"

而且我无法使用 CreateFromFormat 将其转换为 DateTime 对象。我正在使用 JanePHP Normaliser,因此更愿意尝试使用 CreateFromFormat 严格解决这个问题。我尝试了以下方法:

$options = [
    \DateTimeInterface::ATOM,
    \DateTimeInterface::COOKIE,
    \DateTimeInterface::ISO8601,
    \DateTimeInterface::RFC822,
    \DateTimeInterface::RFC850,
    \DateTimeInterface::RFC1036,
    \DateTimeInterface::RFC1123,
    \DateTimeInterface::RFC7231,
    \DateTimeInterface::RFC2822,
    \DateTimeInterface::RFC3339,
    \DateTimeInterface::RFC3339_EXTENDED,
    \DateTimeInterface::RSS,
    \DateTimeInterface::W3C,
    'Y-m-dTH:i:s.uP',
    'Y-m-dTH:i:s.P',
    'Y-m-dTH:i:s.vP',
];

foreach ($options as $name) {
    var_dump(\DateTime::createFromFormat($name, "2021-06-08T13:09:00.9796129Z"));
}

所有结果:

bool(false)
bool(false)
bool(false)
bool(false)
bool(false)
bool(false)
bool(false)
bool(false)
bool(false)
bool(false)
bool(false)
bool(false)
bool(false)
bool(false)
bool(false)
bool(false)

正确的格式是什么?

【问题讨论】:

    标签: php


    【解决方案1】:

    你有一个简单的问题,还有一个更复杂的问题。

    简单的问题是,要匹配文字 T,您需要使用反斜杠对其进行转义。这应该允许这种模式:

    'Y-m-d\TH:i:s.uP'

    (年-月-日,文字 T,时:分:秒.微秒,时区)

    复杂的问题是您的时间戳在秒内有 7 个小数位,分辨率为 十分之一微秒。这就是 u 说明符不匹配的原因:

    u:微秒(最多六位数)

    解决方法是使用 ?匹配任何单个字节的说明符:

    'Y-m-d\TH:i:s.u?P'

    (年-月-日,文字 T,时:分:秒.微秒,忽略多余数字的字节,时区)

    var_dump(\DateTime::createFromFormat('Y-m-d\TH:i:s.u?P', "2021-06-08T13:09:00.9796129Z"));
    
    # object(DateTime)#1 (3) {
    #   ["date"]=>
    #   string(26) "2021-06-08 13:09:00.979612"
    #   ["timezone_type"]=>
    #   int(2)
    #   ["timezone"]=>
    #   string(1) "Z"
    # }
    

    【讨论】:

    • ? 忽略一个字节是我不知道的。 6 对 7 位数现在非常有意义。我不知道他们为什么以这种格式发送给我。谢谢。
    【解决方案2】:

    您没有转义 T,因此它试图将其用作占位符(时区缩写)。正确的格式是

    'Y-m-d\TH:i:s.u\Z'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-22
      • 1970-01-01
      • 2011-07-20
      • 1970-01-01
      • 2017-11-01
      相关资源
      最近更新 更多