2009-07-13 116 views
1

我對mktime函數有點麻煩。在我的生產服務器,如果我執行以下命令:MKTime函數返回錯誤時間?

echo '<p>' . mktime(24, 0,0, 8,29,2009) . ' - 12pm</p>'; 
echo '<p>' . mktime(23, 0,0, 8,29,2009) . ' - 11pm</p>'; 
echo '<p>' . mktime(22, 0,0, 8,29,2009) . ' - 10pm</p>'; 

,然後再轉換的時間戳回可讀格式(使用www.unixtimestamp.com快速轉換),時代都關閉一小時。我原本以爲這是2400 VS 0000的一個問題,但這並不代表其他日期關閉。

任何想法?

回答

5

您的服務器擁有與您所期待的不同的時區。 Unix時間戳記自從1.1.1970 00:00:00 GMT以秒爲單位進行測量,因此您的代碼中存在隱藏的時區轉換。您可以

+0

我設置了未設置的默認時區。進一步的調查看起來像我跳過槍,時間戳轉換向前和向後很好,它使它進入數據庫就好了。這似乎只是一個顯示問題。感謝您的幫助。 – 2009-07-13 18:50:14

0

我剛剛從命令行運行以下內容並獲得了以下(預期)輸出。如果你運行它們會發生什麼?

$ php -r "echo date('H:i:s Y-m-d', mktime(24, 0, 0, 8, 29, 2009));" 
00:00:00 2009-08-30 

$ php -r "echo date('H:i:s Y-m-d', mktime(23, 0, 0, 8, 29, 2009));" 
23:00:00 2009-08-29 

$ php -r "echo date('H:i:s Y-m-d', mktime(22, 0, 0, 8, 29, 2009));" 
22:00:00 2009-08-29 
0

我的問題是,在mktime我輸入的日期和月份與前導零。比函數返回錯誤的結果。一種選擇是用一個函數來刪除前導零象

$str = ltrim($str, '0'); 

來源:How to remove all leading zeroes in a string

$var = (int)$var; 

來源:PHP remove first zeros

我使用soulmerge一種可能性:

$date = new DateTime($year . '-' . $month . '-' . $day . ' ' . $hour . ':' . $minute . ':' . $seconds); 
$match_time = $date->getTimestamp(); 

但時區應始終設置(或與date_default_timezone_set()或直接與DateTime

+0

雖然不是OP中的罪魁禍首,但值得注意的是,這可能是坑坑窪窪。 – johnsnails 2014-09-14 23:57:32