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

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

我想要偶数天,并不关心夏令时。我想我可以绕过结果,但感觉很糟糕。有更好的(简单)方式吗?如果我能避免的话,我不想写一整天解析和计算 - 避免闰年的事情。

(注意:这必须在php 5.1.6下运行,因此5.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";  
}  

其他提示

强制日期进入时区,没有夏令时,格林威治标准时间/ 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

您可以使用 floor() ceil()

我尝试了上面的'UTC'代码。没有为我工作。我得到小数值。

当日期范围内有夏令时时,差异序列小数部分将低于.5或更高。当日期范围在3月15日进行日光节约时,十进制值为<!> gt; .5当日光离开日期十进制<!> lt; 0.5。所以我只是将差异序列放在round()函数中,我得到了我需要的整数天数。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top