我在巴西,本周六我们改到了夏令时间。
我有一个循环,在选定的时间范围内为每天的午夜生成时间戳。所以我得到了第一天的时间戳:
$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()
- 日期周期()
演示