PHP DateTime CreateFromFormat问题

时间:2017-08-31 18:00:05

标签: php date datetime

function validateDate($date, $format = 'm-Y') {
    $d = DateTime::createFromFormat($format, $date);
    return $d && $d->format($format) == $date;
}


validateDate('09-2017', 'm-Y');

函数已从此answerphp.net

复制

我很困惑为什么这会在前几个月返回true时返回false。有什么想法吗?

2 个答案:

答案 0 :(得分:5)

这是因为你没有提供一天,所以它默认使用当天。当天是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

函数已从此answerphp.net

复制

这有点简陋,但您可以检测格式中是否没有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

答案 1 :(得分:1)

如果你不提供一天。使用当前的;就像之前的回答中解释的那样。 但是这可以通过一个格式符号快速解决:!,它将所有字段(年,月,日,小时,分钟,秒,分数和时区信息)重置为Unix Epoch;见format table

修正:

function validateDate($date, $format = 'm-Y') {
    $d = DateTime::createFromFormat('!'.$format, $date);
    return $d && $d->format($format) == $date;
}

函数已从此answerphp.net

复制