2

任何人都可以向我解释这个例子中的 strtotime 函数有什么问题吗?我正在尝试计算日期之间的差异。PHP 5.6.0 (cli) (built: Aug 28 2014 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/>';
} 
4

3 回答 3

5

strtotime()不适用于日期数学。手册甚至这么说

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

日子并不完全是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>";
} 

演示

于 2014-09-10T00:35:12.260 回答
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/>';
}
于 2014-09-10T00:34:23.337 回答
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"

PS 使用带有 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;
}
于 2014-09-10T00:38:09.517 回答