2017-08-31 38 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

相關問題