PHP格式的日期有毫秒可行,但解析失败

gan*_*o55 4 php datetime

我使用以下格式Y-m-d\TH:i:s.v\Z来遵循JavaScript toISOString实现(2011-10-05T14:48:00.000Z).

如果我有一个DateTime并且我想格式化它,一切正常,但是我不能解析使用这种格式的字符串.

$format = 'Y-m-d\TH:i:s.v\Z';
$stringDateTime = (new \DateTime())->format($format);
var_dump(date_create_from_format($format,$stringDateTime));
Run Code Online (Sandbox Code Playgroud)

我正在使用PHP 7,我已经使用PHP 7.0,7.1和7.2测试了上面的代码.我期望在第3行中返回的是一个DateTime类,但是false由于存在解析问题,我得到了一个.

我希望有人可以澄清这种行为.谢谢

Law*_*one 6

Datetime会很好地处理它,你不需要从格式创建.

<?php
$format = 'Y-m-d\TH:i:s.v\Z';
$stringDateTime = (new \DateTime())->format($format);
var_dump(date_create($stringDateTime));
Run Code Online (Sandbox Code Playgroud)

https://3v4l.org/phLE1

结果:

object(DateTime)#1 (3) {
  ["date"]=>
  string(26) "2018-03-13 18:07:30.005000"
  ["timezone_type"]=>
  int(2)
  ["timezone"]=>
  string(1) "Z"
}
Run Code Online (Sandbox Code Playgroud)

这也有效:

<?php
$format = 'Y-m-d\TH:i:s.u\Z';
$stringDateTime = (new \DateTime())->format($format);
var_dump(date_create_from_format($format, $stringDateTime));

$format = \DateTime::ISO8601;
$stringDateTime = (new \DateTime())->format($format);
var_dump(date_create_from_format($format, $stringDateTime));
Run Code Online (Sandbox Code Playgroud)

https://3v4l.org/FcUqe

object(DateTime)#1 (3) {
  ["date"]=>
  string(26) "2018-03-13 18:15:10.011717"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(16) "Europe/Amsterdam"
}
object(DateTime)#1 (3) {
  ["date"]=>
  string(26) "2018-03-13 18:15:10.000000"
  ["timezone_type"]=>
  int(1)
  ["timezone"]=>
  string(6) "+01:00"
}
Run Code Online (Sandbox Code Playgroud)