PHP strtotime日期差异问题

时间:2014-09-10 00:22:41

标签: php strtotime date-math

在这个例子中,任何人都可以解释一下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/>';
} 

3 个答案:

答案 0 :(得分:5)

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

  

不建议使用此函数进行数学运算。

天数不完全60*60*24秒等等。

正如评论DateTime()中提到的那样很多更适合这种情况,因为它解决了夏令时,闰年等问题。以下是执行相同操作的高级方法使用DateTime()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

答案 1 :(得分:1)

我不知道预期的输出是什么,但另外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/>';
}

答案 2 :(得分:1)

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

关于伦敦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"

P.S。 使用带有z的date按预期工作。

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;
}