function validateDate($date, $format = 'm-Y') {
$d = DateTime::createFromFormat($format, $date);
return $d && $d->format($format) == $date;
}
validateDate('09-2017', 'm-Y');
Run Code Online (Sandbox Code Playgroud)
我很困惑为什么这会在前几个月返回true时返回false.有任何想法吗?
这是因为你没有提供一天,所以它默认使用当天.当天是31天,但9月只有30天,所以它会跳到10月1日.
看看这个例子:
function validateDate($date, $format = 'm-Y') {
$d = DateTime::createFromFormat($format, $date);
echo $d->format("d-".$format); // added the day for debugging
return $d && $d->format($format) == $date;
}
var_dump(validateDate('08-2017', 'm-Y')); // 31-08-2017, true
var_dump(validateDate('09-2017', 'm-Y')); // 01-10-2017, there's no 31-09-2017, false
Run Code Online (Sandbox Code Playgroud)
这有点简陋,但你可以检测d格式中是否没有,并手动将其设置为1以避免这种情况:
<?php
function validateDate($date, $format = 'm-Y') {
if (strpos($format, "d") === false) {
$format = "d ".$format;
$date = "01 ".$date;
}
$d = DateTime::createFromFormat($format, $date);
return $d && $d->format($format) === $date;
}
var_dump(validateDate('08-2017', 'm-Y')); // 31-08-2017, true
var_dump(validateDate('09-2017', 'm-Y')); // 01-09-2017, true
Run Code Online (Sandbox Code Playgroud)