【问题标题】:PHP and the end of OctoberPHP 和 10 月底
【发布时间】:2016-06-16 10:48:30
【问题描述】:

我发现了最奇怪的错误。而且我不是要求修复,我只是想知道你们是否有同样的经历并将其留作将来参考。

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

【问题讨论】:

  • 对于 PHP 版本 5.5.9 - 它正常工作并打印所有值
  • 使用 PHP 7.0 它也可以正常工作。
  • 我可以在 5.4.45 下确认该错误。
  • 夏令时?您的时区设置是什么 - 使用 UTC。
  • omg 当然是夏令时。我现在觉得很愚蠢:)

标签: php date timestamp


【解决方案1】:

将秒数添加到时间戳以更改天/周/月可能会产生意想不到的结果。尝试明确添加一天...

$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 小时。

【讨论】:

  • 我已经怀疑这是一个时区问题。 Ofc 现在是夏令时
【解决方案2】:

我不知道为什么您的代码不起作用,但是尝试像这样重构您的代码并且它会起作用:

$fday = "2016-01-01";
for($i = 1; $i<= 365; $i++){
    $day = date("Y-m-d", strtotime($fday)+(60*60*24)*$i);
    echo $day."<br/>";
}

在这里,我总是从一月一日开始,通过将$i 与每天的秒数相乘来添加时间差异。

有趣的是,当您将开始日期设置为“30-10-2016”时,您的原始代码也将不起作用。

【讨论】:

    【解决方案3】:

    我强烈推荐使用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
    

    【讨论】:

      猜你喜欢
      • 2016-07-16
      • 2021-11-01
      • 1970-01-01
      • 2020-07-14
      • 1970-01-01
      • 2018-06-06
      • 1970-01-01
      • 1970-01-01
      • 2010-11-05
      相关资源
      最近更新 更多