我在巴西,我们在本周六改为夏令时。
我有一个循环,可以在选定的时间范围内为每天的午夜生成时间戳。 所以我得到了第一天的时间:
$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个小时? 我做错了什么?
我的时区是正确的,服务器在星期六自动改为夏季。
答案 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";
}
<强>参考强>