【问题标题】:PHP DateTime CreateFromFormat IssuePHP DateTime CreateFromFormat 问题
【发布时间】:2017-08-31 18:00:04
【问题描述】:
function validateDate($date, $format = 'm-Y') {
    $d = DateTime::createFromFormat($format, $date);
    return $d && $d->format($format) == $date;
}


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

函数是从 answerphp.net 复制而来的

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

【问题讨论】:

    标签: php date datetime


    【解决方案1】:

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

    【讨论】:

    • 啊啊啊啊!不错的收获!很好的解释。非常感谢你! :-)
    • 没问题!我添加了一个我根本不喜欢的可能解决方案,但请检查一下!
    • 漂亮!我喜欢在格式中快速查找“d”。似乎是最有效的方法。
    【解决方案2】:

    如果您没有供应一天。使用当前一个;就像在前面的答案中解释的那样。 但这可以通过一种格式符号快速解决:!,它将所有字段(年、月、日、小时、分钟、秒、分数和时区信息)重置为 Unix 纪元;见format table

    修复:

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

    函数是从 answerphp.net 复制而来的

    【讨论】:

    • 我的函数是如何被复制的?进行典型的日期检查只需两行代码,甚至不是复杂的行。我什至犯了一个错误哈哈。很好的答案,但不知道!,+1 谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    • 2017-11-01
    • 2012-04-24
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    • 2013-06-09
    相关资源
    最近更新 更多