在php日期的奇怪行为

时间:2011-10-26 09:17:53

标签: php date

打印日期的简单代码

$first_date = 1319493600;
$last_date = 1320184800;

$testDate = $first_date;


while ($testDate<=$last_date)
{
    echo strftime("%a", $testDate).' '. strftime("%d", $testDate).' '.strftime("%b", $testDate).'<br>';
    $testDate += 86400;
}

是的,这个简单的脚本让我失败了,如下所示

Tue 25 Oct
Wed 26 Oct
Thu 27 Oct
Fri 28 Oct
Sat 29 Oct
Sun 30 Oct <----Error
Sun 30 Oct <----Error
Mon 31 Oct
Tue 01 Nov

任何人都知道为什么?

4 个答案:

答案 0 :(得分:3)

看起来它与DST有关..时钟在十月的最后一个星期日,即今年10月30日星期日发生了变化。

注意:你也必须处于“正确”的时区才能发生这种情况,例如这里是:

 # date -ud@1319493600
 Mon Oct 24 22:00:00 UTC 2011

所以一小时没有任何区别,但对你而言却是如此。这可能非常烦人,因为人们将无法重现您的问题:)

答案 1 :(得分:3)

事实上,这就是为什么你不应该通过在时间戳上增加24小时来增加一天的原因。您有可能在时区观察夏令时,而10月的最后一个星期日则不是24小时。

您可以通过在循环中添加echo strftime("%r %x", $testDate);来确认这一点。 (另请注意,您可以在strftime()中使用多个修饰符,因此您无需连接它们:strftime("%a %d %b", $testDate);。)

始终使用strtotime()mktime()等日期函数来增加日期。

答案 2 :(得分:2)

这可能与10月30日的夏令时变化有关。尝试运行脚本并打印时间以查看更改。这是我的时区中的一个例子:

php > $first_date = 1319493600;
php > $last_date = 1320184800;
php >
php > $testDate = $first_date;
php >
php >
php > while ($testDate<=$last_date)
php > {
php {     echo strftime("%a", $testDate).' '. strftime("%d", $testDate).' '.strftime("%b", $testDate). '(' . strftime("%d.%m.%Y %H:%M:%S", $testDate) . ")\n";
php {     $testDate += 86400;
php { }
Mon 24 Oct(24.10.2011 23:00:00)
Tue 25 Oct(25.10.2011 23:00:00)
Wed 26 Oct(26.10.2011 23:00:00)
Thu 27 Oct(27.10.2011 23:00:00)
Fri 28 Oct(28.10.2011 23:00:00)
Sat 29 Oct(29.10.2011 23:00:00)
Sun 30 Oct(30.10.2011 22:00:00)
Mon 31 Oct(31.10.2011 22:00:00)
Tue 01 Nov(01.11.2011 22:00:00)

答案 3 :(得分:0)

在我的机器上输出为:

root@ubuntu:~# php /tmp/tst.php
Mon 24 Oct
Tue 25 Oct
Wed 26 Oct
Thu 27 Oct
Fri 28 Oct
Sat 29 Oct
Sun 30 Oct
Mon 31 Oct
Tue 01 Nov
root@ubuntu:~# php -v
PHP 5.3.5-1ubuntu7.2 with Suhosin-Patch (cli) (built: May  2 2011 23:18:30)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies

您使用的是哪个PHP版本?

此外,它可能与夏令时有关 - 尝试打印时间