我需要只使用month
和year
创建一个日期。
我使用的是这个代码:
$mData="1 2003";
$mDate=DateTime::createFromFormat("n Y", $mData);
var_dump($mDate);
这种情况下的输出良好:
object(DateTime)#1 (3) {
["date"]=>
string(26) "2003-01-10 15:43:33.000000"
["timezone_type"]=>
int(3)
["timezone"]=>
string(13) "Europe/Berlin"
}
现在我尝试一个不存在的月:
$mData="21 2003";
$mDate=DateTime::createFromFormat("n Y", $mData);
var_dump($mDate);
输出日期为2004年9月!:
object(DateTime)#1 (3) {
["date"]=>
string(26) "2004-09-10 15:45:26.000000"
["timezone_type"]=>
int(3)
["timezone"]=>
string(13) "Europe/Berlin"
}
为什么在这种情况下$mDate
不是false
或出现任何错误?
以这种方式控制错误日期是不可能创建一个有效的DateTime
对象的。
在我的场景中,我不能用另一种格式更改格式"n Y"
,那么我需要实现这种控制错误吗?有可能吗?
现在我尝试一个月不存在21
21 = 12 + 9 = 1y + 9m
这正是你得到的
string(26) "2004-09-10 15:45:26.000000"
正如另一个答案所指出的,行为就是行为,所以你可以检查自己:
$mData = "21 2003";
$a = explode(' ', $mData);
var_dump(
checkdate($a[0], 1, $a[1])
);
您可以检查DateTime对象中的年份是否与输入的年份相同:
$mData = "13 2003";
$mDate = DateTime::createFromFormat ("!n Y", $mData);
$error = ($mDate === false OR strpos($mData, $mDate->format('Y')) < 2) ;
var_dump($error); //bool(true)
或者使用date_get_last_errors((。此函数提供一个可以评估的警告。
$mData = "21 2003";
$mDate = DateTime::createFromFormat ("!n Y", $mData);
var_dump(date_get_last_errors());
输出:
array(4) {
["warning_count"]=>
int(1)
["warnings"]=>
array(1) {
[7]=>
string(27) "The parsed date was invalid"
}
["error_count"]=>
int(0)
["errors"]=>
array(0) {
}
}
注意:格式"!n Y"会产生日期为第1天、时间为00:00的日期。
$mData = "5 2003";
$mDate = DateTime::createFromFormat ("!n Y", $mData);
$error = ($mDate === false OR strpos($mData, $mDate->format('Y')) < 2) ;
var_dump($mDate,$error);
输出:
object(DateTime)#1 (3) {
["date"]=>
string(26) "2003-05-01 00:00:00.000000"
["timezone_type"]=>
int(3)
["timezone"]=>
string(13) "Europe/Berlin"
}
bool(false)