我遇到了从字符串中获取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',
),
)
答案 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"
}
}
他们显然对错误有不同的行为:
date_parse_from_format()总是会返回一些内容:
返回关联数组,其中包含有关给定日期的详细信息。
DateTime::createFromFormat,另一方面:
失败时返回新的
DateTime
实例或FALSE
。
出于好奇,面对严重错误的数据:
$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)
}