我有一个日期-时间标记:
"2021-06-08T13:09:00.9796129Z"而且我不能使用DateTime将其转换为CreateFromFormat对象。我使用的是JanePHP规范器,所以希望严格使用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)正确的格式是什么?
发布于 2021-06-08 13:46:38
你有一个简单的问题,还有一个更复杂的问题。
简单的问题是,要匹配文字T,需要用反斜杠来转义它。这应该允许这种模式:
‘Y\TH:I:s.uP’
(年月日,文字T,hour:minute:second.microsecond,时区)
复杂的问题是,时间戳在秒内有7个小数位,分辨率为十分之一微秒。这就是为什么u说明符不匹配的原因:
u:微秒(最多六位数)
解决办法是使用?与任何单个字节匹配的说明符:
‘Y-m-d:I:S.U?P’
(年月日,文字T,hour:minute:second.microsecond,忽略额外数字时区的字节)
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"
# }发布于 2021-06-08 13:44:11
您没有转义T,所以它试图使用它作为占位符(Timezone缩写)。正确的格式是
'Y-m-d\TH:i:s.u\Z'https://stackoverflow.com/questions/67888073
复制相似问题