【问题标题】:PHP strtotime Issue with date differencesPHP strtotime 日期差异问题
【发布时间】:2014-09-10 00:22:41
【问题描述】:

谁能解释一下这个例子中的 strtotime 函数有什么问题?我正在尝试计算日期之间的差异。 PHP 5.6.0 (cli)(构建:2014 年 8 月 28 日 08:03:51) 当我执行这个循环时,它会显示数字 88 两次。

date_default_timezone_set('Europe/London');
for($i=1;$i<=100;$i++){
    $daysAfterTime = floor( abs( strtotime('2014-01-01') - strtotime('2014-01-01 +'.$i.' days')  )/(60*60*24));
    echo $daysAfterTime.'<br/>';
} 

【问题讨论】:

  • 我不知道预期的结果是什么,但我建议使用 DateTime 类来查找时差。
  • 谢谢大家的提示

标签: php strtotime date-math


【解决方案1】:

strtotime() 不适用于日期数学。 The manual even says so

不建议将此函数用于数学运算。

天不完全是 60*60*24 秒长,等等。

正如 cmets 中提到的,DateTime()非常更适合这种情况,因为它考虑了夏令时、闰年等。这是使用 @ 执行相同操作的高级方法987654322@、DateInterval()DatePeriod() 对于任何试图弄清楚发生了什么的人来说也更清楚。

$start    = new DateTimeImmutable('2014-01-01', new DateTimeZone('Europe/London'));
$finish   = $start->modify('+101 days'); // extra day as the last day is not inclusive
$interval = new DateInterval('P1D');     // interval of one day 
$period   = new DatePeriod($start, $interval, $finish);
foreach ($period as $date) {
    $diff = $start->diff($date);
    echo $diff->days . "<br>";
} 

Demo

【讨论】:

    【解决方案2】:

    我不知道预期的输出是什么,但其他 88 个结果是因为 floor() 函数。它将最小值四舍五入,因此重复了 88。切换增长值减去常数值,这样您就不需要使用abs() 并使用ceil()

    date_default_timezone_set('Europe/London');
    for($i=1;$i<=100;$i++){
        $daysAfterTime = ceil((strtotime('2014-01-01 +'.$i.' days') - strtotime('2014-01-01'))/(60*60*24));
        echo $daysAfterTime.'<br/>';
    }
    

    【讨论】:

      【解决方案3】:
      date_default_timezone_set('Europe/London');
      echo (strtotime('2014-01-01 +89 days') - strtotime('2014-01-01 +88 days'))/(60*60), ' hours per day';
      // 23 hours per day
      

      我认为欧洲/伦敦时区使用DST

      伦敦夏令时信息:http://www.timeanddate.com/time/zone/uk/london

      var_dump(date('Y-m-d',strtotime('2014-01-01 +88 days')));
      // string(10) "2014-03-30"
      

      附: 将 date 与 z 一起使用可以按预期工作。

      date_default_timezone_set('Europe/London');
      for($i=1;$i<=100;$i++){
          $daysAfterTime = date('z', strtotime('2014-01-01 +'.$i.' days')) - date('z', strtotime('2014-01-01'));
          echo $daysAfterTime.PHP_EOL;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-20
        • 1970-01-01
        • 1970-01-01
        • 2017-04-04
        • 1970-01-01
        相关资源
        最近更新 更多