2011-10-05 160 views
0
<?php 

header('Content-Type: text/plain'); 

$time = '0000-00-00 00:00:00'; 
echo $time . PHP_EOL . PHP_EOL; 

$time = strtotime($time); 
echo $time . PHP_EOL . PHP_EOL; 

在我們的開發服務器上,第二個$time不輸出任何內容。 var_dump()的測試顯示其值爲false。這很好。在現場服務器上,我得到943920000。用var_dump()進行的測試顯示這是一個整數。爲什麼strtotime()在不同的服務器上以不同的方式工作?

爲什麼?

顯然it is fairly common for dates of zero to come up as 30 November 1999。爲什麼?爲什麼在某些服務器上而不是其他的?

+0

這可能是因爲不同服務器上的時區差異或配置? –

+0

也許不是最好的解決方案,但在做轉換之前檢查'$ time == 0'是什麼?詳細瞭解您的設置(時區配置,PHP版本,...) – breiti

+0

@breiti。這就是我最終做的。它似乎工作。我只是想知道1999年11月30日有什麼特別的。 – TRiG

回答

0

PHP Manual page for strtotime()之前,我們得到如下:

成功則返回時間戳,否則返回FALSE。

因此,在您的其中一臺服務器上,致strtotime()的呼叫失敗。

那麼爲什麼會失敗呢?這個問題的答案也是一樣的手冊頁:

錯誤/異常

每次調用日期/時間函數,如果時區是無效的會產生一個E_NOTICE,和/或如果使用系統設置或TZ環境變量,則顯示E_STRICT或E_WARNING消息。另請參見date_default_timezone_set()

因此,在我看來,您的一臺服務器沒有正確配置時區語言環境。如果可能的話,我建議不要使用strtotime()這樣的東西。這是一個笨重的舊功能,而較新的PHP datetime library提供更好/更乾淨的功能。您可以使用它創建一個日期時間對象,如下所示:

$date = new DateTime('0000-00-00 00:00:00'); 

希望有幫助。

+0

[PHP.net上的評論](https://bugs.php.net/bug.php?id=45647):「這裏沒有錯誤,00-00- 00表示2000-00-00,即1999-12-00,即1999-11-30。沒有錯誤,完全正常。「 – TRiG

1

嘗試

setlocale(LC_ALL, "C"); 

任何的strtotime呼叫

相關問題