我发现了最奇怪的错误。而且我不是要求修复,我只是好奇你们是否经历过同样的事情并留待将来参考。
我有以下代码,应该在2016年的每一天输出
$day = "2016-01-01";
for($i = 1; $i<= 365; $i++){
$day = date("Y-m-d", strtotime($day)+60*60*24);
echo $day."<br/>";
}
但在30-10-2016
之后它会停止增加并显示相同的日期。
PHP版本是5.6.22。这种情况每年都会发生,而不仅仅是2016年。 知道是什么导致了这个吗? 这是特定PHP版本的问题吗? 这是时区问题吗? 您是否经历过相同或类似的事情?
我感兴趣的是这个问题的原因。 strtotime函数似乎有问题。
答案 0 :(得分:3)
在时间戳上添加秒数以更改天数/周/月可能会产生意外结果。尝试明确添加一天......
$day = "2016-01-01";
for($i = 1; $i<= 365; $i++){
$day = date("Y-m-d", strtotime("+ 1 day", strtotime($day)));
echo $day.PHP_EOL;
}
您的PHP设置为哪个时区,10月底是否有夏令时变化? - 这将导致日期坚持,因为这一天可能长达25小时。
答案 1 :(得分:1)
我强烈建议使用PHP DateTime objects来生成日期。它比使用程序代码使用数学生成它更简单,而且它允许您进行更精细的控制,例如能够更改间隔(例如,您希望每2天而不是每天)。
DateTime对象包含在PHP 5.2中,因此应该在您的PHP版本上正常工作。
示例代码:
$start = new DateTime('2016-12-01');
$end = new DateTime('2016-12-31');
// Use this to add +1 day as the Interval goes _up to_ the date,
// not inclusive of the date itself
$end = $end->modify( '+1 day' );
// Set the interval to use, can be P2D if you'd like every 2 days.
$interval = new DateInterval('P1D');
$dateRange = new DatePeriod($start, $interval, $end);
foreach($dateRange as $date) {
echo $date->format('Y-m-d') . '<br />';
}
结果:
2016-12-01
2016-12-02
...
2016-12-30
2016-12-31
答案 2 :(得分:1)
我不知道为什么你的代码不起作用,但是这会尝试像这样重构你的代码并且它会起作用:
$fday = "2016-01-01";
for($i = 1; $i<= 365; $i++){
$day = date("Y-m-d", strtotime($fday)+(60*60*24)*$i);
echo $day."<br/>";
}
在这里,我总是从1月1日开始,通过将$i
乘以每天的秒数来添加时差。
有趣的是,当您将开始日期设置为“30-10-2016”时,您的原始代码也将无效。