PHP增加了一天的夏令时


PHP add one day in period of daylight saving

我在巴西,本周六我们改到了夏令时间。

我有一个循环,在选定的时间范围内为每天的午夜生成时间戳。所以我得到了第一天的时间戳:

$start = 1413255600; // 2014-10-14 00:00:00
$end is some date in the future

现在我有一个循环

for ($i = $start; $i <= $end; $i = strtotime('+ 1 day', $i)) {
   echo date('Y-m-d H:i:s', $i);
   echo "<br>";
}

该输出:

2014-10-14 00:00:00
2014-10-15 00:00:00
2014-10-16 00:00:00
2014-10-17 00:00:00
2014-10-18 00:00:00
2014-10-19 01:00:00
2014-10-20 01:00:00

php/服务器现在不应该有时间变化,19号只增加了23个小时吗?我做错了什么?

我的时区是正确的,服务器在周六自动更改为夏季。

我有一个循环,在选定的时间范围内为每天的午夜生成时间戳。

这是你的第一个问题——假设午夜确实存在。这是否属实取决于你对午夜的定义。

在巴西利亚时区(可能还有该地区的其他时区),2014-10-19 00:00:00没有出现。当地时间:

2014-10-18 23:59:58
2014-10-18 23:59:59
2014-10-19 01:00:00
2014-10-19 01:00:01

因此,您的脚本正在做正确的事情——它在2014-10-18 00:00:00中添加了一天,并得出了一个合理的答案:2014-10-19 01:00:00。然后,你在后的一天要求值(凌晨1点),这完全是20日凌晨1点。

如果你想要"每个日期的最早时间",那么你应该确保$start有午夜的日期,然后在$start中添加0天、1天、2天、3天等,而不是重复添加一天。我不是PHP开发人员,但在我看来,使用DateTime::Add会比使用strtotime更好。

根据Jon Skeet的回答,以下是如何使用PHP的DateTime()类来实现这一点。

$start    = $start = (new DateTime('@1413255600'))->modify('midnight'); // Start date
$end      = new DateTime('2014-10-22'); // End date
$interval = new DateInterval('P1D');    // Interval of one day
$period   = new DatePeriod($start, $interval, $end); // Period object to iterate through
foreach ($period as $date) {
   echo $date->format('Y-m-d H:i:s');
   echo "'n";
}

参考

  • 日期时间()
  • DateInterval()
  • 日期周期()

演示