3

我有一个问题,我 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 个时间戳,以一天中的秒数分隔,输入 date(),给出相同的日期 2013-11-03

因为它是 2013 年 11 月 3 日,我知道我们切换到夏令时,并且 I 格式说明符指示一个时间戳在 DST 中,一个不是我认为可以肯定地说我的系统配置错误。

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

pecl 安装时区数据库

并将以下内容添加到 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); 
}

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

标记

4

1 回答 1

9

您不需要安装任何额外的扩展来操作时区,但您确实需要阅读 PHP 如何确定函数的默认时区,如函数手册页上date()总结的。date_default_timezone_get()

您的系统很可能php.ini将选项设置为此处列出date.timezone的地理时区之一,这将考虑该位置的当地夏令时规则。

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

但是,从 PHP 5.2 开始,有一个强大的DateTime 类,它可以在对象中封装时区信息,并包含诸如将时间间隔添加到 date 之类的方法。

请注意, DateTime 上的方法会更改对象,而不是返回新对象;从 PHP 5.5 开始,还有DateTimeImmutable可以反过来工作。

于 2013-11-03T17:56:28.287 回答