php日期和夏令时混淆

时间:2013-11-03 17:34:30

标签: php

我遇到了问题,我从99%开始确信它与昨天开始的夏令时有关。

以下脚本:

<?php
 $i=1383451200;
 echo $i, " ", date('Y-m-d I', @$i);
 echo "\n";
 $i = $i + 86400;
 echo $i, " ", date('Y-m-d I', @$i);
 echo "\n";
?>

(其中86400是一天中的秒数)

给出以下输出

1383451200 2013-11-03 1 1383537600 2013-11-03 0

2个时间戳,以一天中的秒数分隔,输入日期(),给出相同的日期2013-11-03

因为它是IS 11/3/2013并且我知道我们切换到夏令时并且I格式说明符指示一个时间戳在DST中而且一个不是我认为可以说我的系统上有错误的配置

问题是,如何解决?我已经完成了:

pecl install timezonedb

并将以下内容添加到php.ini

延长= / usr / lib中/ PHP5 / 20100525 / timezonedb.so

在我的系统上。

我的系统是Macbook Pro上的Ubuntu 12.10,我正在使用php 5

有任何建议如何解决这个问题?

这就是我想要做的。我想在一个月内打印出每天的日期。

$startTime = strtotime($start);
$endTime = strtotime($end);

其中$ start和$ end是YYYY-MM-DD形式的字符串(用户可以指定它们)

本月的个别日子计算如下:

for ($i = $startTime; $i <= $endTime; $i = $i + 86400) {
     $thisDate = date('Y-m-d', $i); 
}

我希望这打印出从可能的用户指定范围的开始到结束的每个月的每一天的日期。

标记

1 个答案:

答案 0 :(得分:7)

您无需安装任何其他扩展来操作时区,但您需要了解PHP如何确定date()等函数的默认时区,该php.ini汇总在the manual page for the date_default_timezone_get() function上。

您的系统date.timezone很可能会将date_default_timezone_set('UTC');选项设置为其中一个地理时区listed here,这将考虑该地点的当地夏令时规则。

如果您运行{{1}},您应该会看到您的代码按预期输出不同的日期,如in this live example所示。如果您将所有时间戳视为UTC,那么您实际上可以完全回避时区和夏令时的问题,如果您实际上不知道您正在使用的数据应该被解释的时区,这可能是合适的。 as(例如,如果它来自未指定该信息的远程源)。

但是,从PHP 5.2开始,有一个强大的DateTime class可以将时区信息封装在对象中,并包含adding an interval of time to a date之类的方法。

请注意,DateTime上的方法会改变对象,而不是返回一个新对象;从PHP 5.5开始,还有DateTimeImmutable以相反的方式工作。

相关问题