2015-04-01 170 views
0

我有一個非常奇怪的錯誤,我不明白。出於某種原因,某些日期未被正確解析。解析日期錯誤

代碼:

$day = strtotime($_GET['d']."-".$_GET['m']."-".$_GET['y']); 
$dateTimeZone = new DateTimeZone("Europe/Prague"); 
$dateTime = new DateTime($day, $dateTimeZone); 
$offset = ($dateTimeZone->getOffset($dateTime))/3600; 

現在真正奇怪的是.... 如果我通過在特定的數字,它的工作原理,但它與其他人犯規...

例如一個像這樣的URL將工作:

d=15&m=12&y=2014 

但這:

d=12&m=12&y=2014 

顯示

Fatal error: Uncaught exception 'Exception' with message 'DateTime::__construct(): Failed to parse time string (1418252400) at position 7 (4): Unexpected character' in

我試圖用它進行試驗,也改變了的strtotime的格式,但沒有運氣,它只是似乎完全是隨機的工作....

+0

你爲什麼在不同的參數發送日期? – 2015-04-01 16:20:05

+0

你不需要使用strtotime,你可以直接將日期字符串傳遞給'DateTime'對象。錯誤可能是由於日,月和年的順序不正確。它應該是YYYY-MM-DD。 – 2015-04-01 16:20:05

+0

當發生這種情況時'var_dump($ day)'會顯示什麼? – Barmar 2015-04-01 16:20:13

回答

3

當發送時間戳DateTime對象的參數,你必須使用@符號作爲前綴。請參閱本手冊(UNIX時間戳):http://php.net/manual/en/datetime.formats.compound.php

所以,正確的做法是:

$dateTime = new DateTime('@' . $day, $dateTimeZone); 

或者,我更喜歡:

$dateTime = DateTime($_GET['y']."-".$_GET['m']."-".$_GET['d']); 
1

你發送它的無效的參數。

public DateTime::__construct ([ string $time = "now" [, DateTimeZone $timezone = NULL ]])

構造函數期望A date/time string,而不是發送的UNIX時間戳。因此例外。在您放置的日期周圍取消撥打strtotime

現在你或其他人可能會問爲什麼它會在你的其他日期工作呢?不,即使那樣也行不通。試試你的工作日期,看看日期時間日期你得到

echo $dateTime->format("Y-m-d");  

1600-04-01

Fiddle

它沒有(和不應該工作),無論是針對因的strtotime通話的日期。

Manual