2017-08-31 111 views
4
function validateDate($date, $format = 'm-Y') { 
    $d = DateTime::createFromFormat($format, $date); 
    return $d && $d->format($format) == $date; 
} 


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

功能,从这个answerphp.netPHP的DateTime CreateFromFormat问题

复制我很纳闷,为什么当它返回的前几个月真该返回false。有任何想法吗?

回答

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 
+0

AHHHHH复制!好的赶上!优秀的解释。非常感谢你! :-) – theflarenet

+0

这没问题!我添加了一个我不喜欢的可能解决方案,但请检查一下! – ishegg

+0

美丽!我喜欢在格式中快速查找“d”。似乎是最有效的方式来做到这一点。 – theflarenet

1

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

修复:

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

功能,从这个answerphp.net

+0

我的功能如何被复制?这是两行代码进行典型的日期检查,而不是复杂的行。我甚至犯了一个错误哈哈。很好的回答,但是不知道'!',+1谢谢。 – ishegg