2010-04-10 100 views
4

我有一個PHP日期函數bizzare問題。date()返回錯誤的日子,雖然時間戳是正確的!

代碼:我的服務器(本地主機,Windows)在

$numDays = 8; 
$date = strtotime('2010-11-06'); 
for ($i=1; $i<=$numDays; $i++) 
{ 
    $thisDay = date("D, d M Y", $date); 
    print ($thisDay.'<br>'); 
    $date+=86400; // add one day to timestamp 
} 

結果:

星期六,2010 06 11

孫,07十一月2010

週一,11月08 2010

2010年11月9日星期二

週三11月10日2010

週四11月11日2010

星期五,2010 11月12日

星期六,2010

我的Web服務器(Linux版)

的結果11月13日星期六,06 Nov 2010

* Sun,07 Nov 2010

太陽,07 2010年11月*

週一,2010年11月08

星期二,2010 11月09日

星期三,2010 11月10日

星期四,2010 11月11日

週五, 2010年11月12日

請注意2010年11月7日,Sun在遠程服務器上出現兩次?這是爲什麼發生?任何人都可以解釋此行爲?

+6

86400秒= 1天。不幸的是,每個邊緣情況都需要一遍又一遍地學習:夏令時,閏年,閏秒,時區穿越,在光速附近行駛... – Boldewyn 2010-04-10 12:45:54

+0

+1爲旅行光速,讓我想起愛因斯坦的相對性原理! – 2010-04-10 12:56:48

+0

從字面上看,86400 secods = 24小時=一天:)與時區有關的問題是另一回事!問候我的第二個母親的國家:) – mspir 2010-04-10 12:57:04

回答

8

2010年11月7日是許多時區的夏令時開關日期(但不是希臘似乎所在的位置)。從Wikipedia

從2007年開始,大部分美國和加拿大從三月第二個星期日遵守DST的第一個星期日11月,一年的近三分之二。

在希臘,它似乎是October 31。你在你的機器上設置了哪個時區?

+0

你是對的,如果我設置雅典時區(歐洲/雅典)日期顯示正確。但是這意味着如果用戶在美國或加拿大,上述代碼將無法使用!如果我使用美國/太平洋地區作爲時區例如我得到錯誤的結果。有沒有一種簡單的方法來解決這個問題? – mspir 2010-04-10 12:48:24

+0

@spiros我認爲*'strtotime(「+ 1 day」);'會考慮DST。 – 2010-04-10 15:17:53

+0

如果您要從數據庫服務器上提取數據,那麼最好在那裏進行日期操作; Postgres在這裏特別好。具有時區的時間戳存儲可以簡單地投射到另一個時區,並且數據庫可以處理所有的夏令時等(但我認爲上面提到的光速不會被考慮在內) - 有關http://的更多信息www.postgresql.org/docs/8.3/static/datatype-datetime.html#DATATYPE-TIMEZONES。根據我的經驗,MySQL日期函數往往是比較垃圾的,但其他人可能會有更多的信息。 – 2010-04-10 15:18:33

2

在這裏很難確定,但是您可能問題是由遠程服務器時區中的夏令時轉換引起的嗎?

在大多數國家,轉變通常發生在週末和,因爲這一天是由一小時延長,這就是加入86400秒爲時間值之後,將返回日期一例。

+0

有用的設置時區的提示,但佩卡的更詳細和深入,所以我接受了他的。謝謝:) – mspir 2010-04-10 12:50:37

+0

這不提供問題的答案。要批評或要求作者澄清,請在其帖子下方留言。 - [來自評論](/ review/low-quality-posts/10155302) – Nasreddine 2015-11-10 12:29:38

+0

@Nasreddine你會建議我改進此答案嗎?我可以編輯它以提供作者問題的完整解決方案,因爲現在我們知道是什麼導致了它。 – Mihai 2015-11-10 13:18:51

1

以開始日期+1小時然後-1小時運行你的代碼,看看你得到了什麼結果。你會得到更多的線索,最有可能的就是夏令時。

另外,正如Pekka所指出的那樣,嘗試與設置爲10月31日的日期相同,看看會發生什麼。

好問題。

1

這是很好的做法,做UTC時間計算,然後使用PHP的日期時間函數將其轉換爲所需要的時區的用戶的位置:

date_default_timezone_set('UTC'); 
$timezone = new DateTimeZone('Europe/Athens'); 
$datetime = new DateTime('now', $timezone); 
echo $datetime->format('Y-m-d H:i:s'); 
相關問題