如何使用格式创建日期时间"n Y"并使用日期时间::createFromFormat 控制错误的日期



我需要只使用monthyear创建一个日期。

我使用的是这个代码:

$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)

最新更新