2013-09-29 19 views
2

爲什麼PHP的DateTime對象不會給我一個無效的日期輸入錯誤?例如,php日期時間對象不會給我一個無效的日期輸入錯誤?

$date_test = '13-10-31'; 

$datetime = new DateTime(); 
$date = $datetime->createFromFormat('Y-m-d', $date_test); 
$date_errors = $datetime->getLastErrors(); 
print_r($date_errors); 

結果,

Array 
(
    [warning_count] => 0 
    [warnings] => Array 
     (
     ) 

    [error_count] => 0 
    [errors] => Array 
     (
     ) 

) 

我已經設置的日期格式爲 'YMD' 也就是YYYY-MM-DD所以'13 -10-31' 應該是一個誤差輸入是不是?

編輯

,如果我改變這一行$datetime->createFromFormat('Y-m-d', $date_test);

$datetime->createFromFormat('YY-m-d', $date_test); 

我會得到一個錯誤不管我輸入。例如,

$date_test = '2013-10-31'; 

結果,

Array 
(
    [warning_count] => 0 
    [warnings] => Array 
     (
     ) 

    [error_count] => 2 
    [errors] => Array 
     (
      [4] => Unexpected data found. 
      [10] => Data missing 
     ) 

) 

爲什麼!?

+0

'$ date'看起來像什麼?那麼,如果你不使用'$ date',那麼這行('$ date = $ datetime-> createFromFormat('Y-m-d',$ date_test);')會做什麼? – JVE999

+0

10 =十月有31天仍然有效。 – Lenin

+0

正如@Corrupt回答,13被翻譯爲13AD(Anno Domini)。非常有效的日期。 – Lenin

回答

2

您的日期是有效日期,但是您的代碼不正確,因爲DateTime::createFromFormat()是一個靜態函數,因爲它是getLastErrors()。你的示例代碼應該是: -

$date_test = '13-10-31'; 
$date = \DateTime::createFromFormat('Y-m-d', $date_test); 
$date_errors = \DateTime::getLastErrors(); 
print_r($date_errors); 

但是,仍然會有任何錯誤作爲13年10月31日(13-10-31)是一個有效的日期。當您提供'13'作爲年份時,DateTime會將其轉換爲一個整數13,因此它是有效年份。

如果你想丟棄兩位數年份爲無效,那麼你將不得不編寫自己的驗證功能。

我會建議的PHP Date and Time extensions documentation

+0

仍然沒有錯誤'13-10-31' ... – laukok

+1

@lauthiamkok當然它不!正如我在答覆13-10-31中明確指出的那樣__是一個有效日期___。 – vascowhite

+0

感謝您的回答。 – laukok

5

echo $date->format('d-m-Y')顯示31-10-0013,所以看起來像PHP將你的日期視爲正常。


UPDv1:

這不是在docs提及。如果你看看echo $date->format('U');,它會給你一個負面的時間戳。

由於PHPv5.3.0根據3v4l test確認此功能。

+1

有趣的是,在我的Windows系統上'$ date-> getTimestamp()'返回false,而'$ date-> format('U')'給出了預期的負時間戳。它工作正常,但我的Linux的盒子,[這裏](http://3v4l.org/EKp1a)。奇怪 – vascowhite

+0

@vascowhite是的,這是非常有趣的,並沒有記錄... – BlitZ

+0

你的測試是以非靜態方式調用'createFromFormat()'。 – vascowhite

0

這是因爲輸入的日期由Year參數不正確的界定及的,但不是徹底的讀取。

+0

Year參數的正確定義是什麼?謝謝。 – laukok

+1

請查看此處查看完整的日期格式http://php.net/manual/en/function.date.php –

+0

您是否期待數年以前的零數少於4位? @lauthiamkok – Lenin