PHP date_parse_from_format成功,但DateTime :: createFromFormat返回具有相同字符串的boolean

时间:2016-12-28 03:37:53

标签: php datetime

我遇到了从字符串中获取Datetime的问题。     

$dateArray = date_parse_from_format("Y-m-d\TH:i:s.u\Z", "2016-12-27T07:15:42.795927216Z");
echo sprintf("%s/%s %s:%s", $dateArray["month"], $dateArray["day"], $dateArray["hour"], $dateArray["minute"]) . PHP_EOL;
// prints 12/27 7:15 successfully

$dateTime = DateTime::createFromFormat("Y-m-d\TH:i:s.u\Z", "2016-12-27T07:15:42.795927216Z");
//$dateTime->modify('+9 hours'); // Fatal error: Call to a member function modify() on boolean

echo var_export(DateTime::getLastErrors(), true);

 ?>

getLastErrors打印如下。

array (
  'warning_count' => 0,
  'warnings' => 
  array (
  ),
  'error_count' => 2,
  'errors' => 
  array (
    26 => 'Trailing data',
  ),
)

1 个答案:

答案 0 :(得分:1)

如果我们略微调整测试代码,我们可以看到两种方法都发现(相同)错误:

$format = 'Y-m-d\\TH:i:s.u\\Z';
$input = '2016-12-27T07:15:42.795927216Z';

var_dump(date_parse_from_format($format, $input));
echo PHP_EOL;
var_dump(DateTime::createFromFormat($format, $input));
echo PHP_EOL;
var_dump(DateTime::getLastErrors());
array(12) {
  ["year"]=>
  int(2016)
  ["month"]=>
  int(12)
  ["day"]=>
  int(27)
  ["hour"]=>
  int(7)
  ["minute"]=>
  int(15)
  ["second"]=>
  int(42)
  ["fraction"]=>
  float(0.795927)
  ["warning_count"]=>
  int(0)
  ["warnings"]=>
  array(0) {
  }
  ["error_count"]=>
  int(2)
  ["errors"]=>
  array(1) {
    [26]=>
    string(13) "Trailing data"
  }
  ["is_localtime"]=>
  bool(false)
}

bool(false)

array(4) {
  ["warning_count"]=>
  int(0)
  ["warnings"]=>
  array(0) {
  }
  ["error_count"]=>
  int(2)
  ["errors"]=>
  array(1) {
    [26]=>
    string(13) "Trailing data"
  }
}

他们显然对错误有不同的行为:

出于好奇,面对严重错误的数据:

$format = 'Y-m-d';
$input = '$%&#';

......前者回归:

array(12) {
  ["year"]=>
  bool(false)
  ["month"]=>
  bool(false)
  ["day"]=>
  bool(false)
  ["hour"]=>
  bool(false)
  ["minute"]=>
  bool(false)
  ["second"]=>
  bool(false)
  ["fraction"]=>
  bool(false)
  ["warning_count"]=>
  int(0)
  ["warnings"]=>
  array(0) {
  }
  ["error_count"]=>
  int(3)
  ["errors"]=>
  array(2) {
    [0]=>
    string(36) "A four digit year could not be found"
    [4]=>
    string(12) "Data missing"
  }
  ["is_localtime"]=>
  bool(false)
}
相关问题