2013-04-23 179 views
0

首先,這裏是我的代碼:PHP似乎返回不正確平日

<?php 
$year = 1006; 
while ($year <= 1996) 
{ 
    $date = '1/26/' . $year; 
    if (date('l', strtotime($date)) == 'Monday') 
    { 
     echo $date . PHP_EOL; 
    } 

    $year += 10; 
} 
?> 

據說這是爲了輸出1000年至1999年一月26秒,其中一年有6根和日期適逢星期一。這裏是輸出:

1/26/1006 
1/26/1096 
1/26/1136 
1/26/1186 
1/26/1226 
1/26/1316 
1/26/1366 
1/26/1406 
1/26/1496 
1/26/1536 
1/26/1586 
1/26/1626 
1/26/1756 
1/26/1846 
1/26/1976 

一切似乎都很好。然而,當我在看一些這些年timeanddate.com的,平日似乎並不有什麼共同點:

1/26/1006恰逢週六

1/26/1406在週二

1/26/1756下降呢在週一跌倒

這是怎麼回事?

+2

您正在運行32位PHP或64位PHP嗎?如果是32位,那麼最大支持年份範圍是從大約1904年到2032年 – 2013-04-23 16:19:06

+0

是的,我運行32位。 – Joel 2013-04-23 16:31:53

回答

3

strtotime()日期的字符串表示轉換爲unix時間戳 - 自1月1日的秒數,1970年你可能開始看到這裏的問題...

時間戳通常存儲在一個32這個整數的範圍在1970到2038之間。嘗試爲該範圍之外的日期生成時間戳會給你未定義的行爲。

- 編輯 -

從PHP手冊:

時間戳的有效範圍通常爲星期五,1901年12月13日20時45分54秒 GMT到星期二,1月19日2038 03:14:07 GMT。 (這些日期爲 ,對應於32位有符號整數的最小值和最大值)。但是,在PHP 5.1.0之前,在某些系統(例如Windows)上,該範圍從 01-01-1970到19-01-2038被限制。

+0

在大多數平臺上,PHP使用32位__signed__整數,-ve值在1970之前,1904年爲最早的年份;但你說的範圍是正確的OP問題 – 2013-04-23 16:19:56

+0

@MarkBaker「在大多數平臺上」並不包括窗口和PHP 5.1之前的例子,這是很常見的情況。 env的範圍從1970年開始。 – eis 2013-04-23 16:22:06

+0

@SamDufel您可能想要在PHP中添加此時間戳的範圍。他們在[這裏](http://php.net/manual/en/function.date.php)中提到,在更新日誌中。 – eis 2013-04-23 16:23:33