1

我正在尝试计算两天之间的天数,但我遇到了夏令时问题。这是我的代码:

function date_diff($old_date, $new_date) {
    $offset = strtotime($new_date) - strtotime($old_date);
    return $offset/60/60/24;
}

只要这几天都在同一 DST 期间,就可以正常工作:

echo date_diff('3/15/09', '3/18/09'); // 3

但如果它们相距更远,则不会:

echo date_diff('11/15/08', '3/18/09'); // 122.95833333333

我想要偶数天,不关心 DST。我想我可以对结果进行四舍五入,但这感觉很笨拙。有没有更好(简单)的方法?如果可以避免的话,我不想写一整天的解析和计数避免闰年的事情。

(注意:这必须在 php 5.1.6 下运行,因此 5.3 中的某些日期功能可能不可用。)

更多信息:我将获取偏移量并将其添加到数据库中的其他日期时间,并且我只想更改日期部分,而不是时间部分。无论如何,四舍五入是行不通的,因为当我进行添加时,它会在另一个方向下降一小时。也许有一个更好的方法来解决整个问题......

4

4 回答 4

8

强制日期进入没有夏令时,GMT/UTC 的时区:

function date_diff($old_date, $new_date) {
  $offset = strtotime($new_date . " UTC") - strtotime($old_date . " UTC");
  return $offset/60/60/24;
}

echo date_diff('3/15/09', '3/18/09'); // 3
echo date_diff('11/15/08', '3/18/09'); // 123
于 2009-04-29T22:59:27.740 回答
3

您可以使用http://ca3.php.net/date_default_timezone_set将时区设置为 GMT,这样就不会有偏移。

或者,您可以使用date('I',$timetamp)

if ( date("I") == 1 ) {      // "WE ARE MDT";  
        $timeZone = "MDT";  
} else {  
        $timeZone = "MST";  
}  
于 2009-04-29T22:42:15.643 回答
0

floor()您可以使用或强制在特定方向进行舍入ceil()

于 2009-04-29T22:51:57.367 回答
0

我尝试了上面的“UTC”代码。没有为我工作。我得到十进制值。

当日期范围内有夏令时日期时,差值序列小数部分将低于 0.5 或更大。当日期范围有夏令时进行 3/15 时,十进制值 > .5 当日光关闭时,日期十进制 < .5。所以我只是将差异序列放在一个 round() 函数中,我得到了我需要的天数的整数。

于 2010-03-18T18:56:11.607 回答