PHP在夏令时中添加一天

时间:2014-10-20 14:02:14

标签: php date

我在巴西,我们在本周六改为夏令时。

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

$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个小时? 我做错了什么?

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

2 个答案:

答案 0 :(得分:3)

  

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

这是你的第一个问题 - 假设午夜甚至存在。这是否真实取决于你对午夜的定义。

在巴西利亚时区(可能是该地区的其他地区),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 有午夜的日期,然后添加0天,1天,2天,3天等到$start - 而不是重复添加一天。我不是PHP开发人员,但在我看来,使用DateTime::Add比使用strtotime更好的方法。

答案 1 :(得分:3)

根据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";
}

<强>参考

Demo