PHP和10月底

时间:2016-06-16 10:48:31

标签: php date timestamp

我发现了最奇怪的错误。而且我不是要求修复,我只是好奇你们是否经历过同样的事情并留待将来参考。

我有以下代码,应该在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函数似乎有问题。

3 个答案:

答案 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”时,您的原始代码也将无效。