2012-04-12 53 views
6

嗨我似乎遇到麻煩讓datetime方法按預期工作?我可能做錯了什麼?php DateTime createFromFormat功能

// Passes OK 
$dateTime = DateTime::createFromFormat('d/m/Y', '12/12/2012'); 
var_dump($dateTime); 

// should fail but returns - 2016-09-25 
$dateTime = DateTime::createFromFormat('d/m/Y', '56/56/2012'); 
var_dump($dateTime); 

// correctly returns False 
$dateTime = DateTime::createFromFormat('d/m/Y', '56/56/fail'); 
var_dump($dateTime); 

// should fail but returns 2019-08-29 09:58:10 
$dateTime = DateTime::createFromFormat('m/d/Y', '90/90/2012'); 
var_dump($dateTime); 

enter image description here

回答

30

事情有關DateTime::createFromFormat是有種意外輸入它承認的背後進行。

輸入諸如'56/56/fail'會產生錯誤,所以false返回,一切都很好。然而,'56/56/2012'並不是錯誤,而是一個警告,實際上解析爲2012年第56個月的第56天。自2012年以來沒有56個月,PHP在內部將其更改爲2016 + 8個月= 2016年8月。一個月沒有56天,我們有另一個補償到2016年9月+(56 - 31)天= 2016年9月25日。所以雖然出乎意料,但事實上這是正確的。

如果你希望禁止這種自動調整,你必須包裹DateTime工廠方法和使用DateTime::getLastErrors作爲參考:

$dateTime = DateTime::createFromFormat('d/m/Y', '56/56/2012'); 
$errors = DateTime::getLastErrors(); 
if (!empty($errors['warning_count'])) { 
    echo "Strictly speaking, that date was invalid!\n"; 
} 

See it in action

+0

感謝您的回覆。是100%的現貨,很好的解釋。 – 2012-04-12 09:50:59

+0

對於檢查做好準備複製/粘貼它應該有初步檢查,以及: 如果(!$日期時間||空($錯誤[「WARNING_COUNT」])){ :) – 2016-02-26 12:14:31

1

其實這是正確的:例如,如果您創建了2012年4月31日的日期(無效日期)PHP返回2012/05/01(5月的第一天)!產生錯誤的種類和產生警告類型:

這場景

1

PHP是一個奇怪的野獸(至少可以這麼說)。 56/56/2012導致所有額外的月份和日期被添加到日期直到它變得正確(上帝只知道這背後的邏輯)。

+1

我懷疑邏輯就是讓程序員做一些懶惰的日期計算。如果你想添加90天或18個月的東西,你可以在沒有進行計算的時候把數字塞進去,自己包裝幾個月/幾年,PHP會爲你排序並返回你想要的。 – 2015-01-14 12:08:03