2013-04-23 112 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