我正在尝试计算两天之间的天数,但我遇到了夏令时的问题。这是我的代码:
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中的某些日期功能可能无法使用。)
更多信息:我将获取偏移量并将其添加到数据库中的其他日期时间,并且我只希望更改日期部分,而不是时间部分。无论如何,结果舍入将无效,因为当我进行添加时,它会在另一个方向上下一个小时。也许对整个问题有一个更好的方法....
答案 0 :(得分:7)
强制日期进入时区,没有夏令时,格林威治标准时间/ 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
答案 1 :(得分:2)
您可以使用http://ca3.php.net/date_default_timezone_set将时区设置为GMT,这样就不会有偏移量。
或者,您可以使用date('I',$timetamp)
if ( date("I") == 1 ) { // "WE ARE MDT";
$timeZone = "MDT";
} else {
$timeZone = "MST";
}
答案 2 :(得分:0)
答案 3 :(得分:0)
我尝试了上面的'UTC'代码。没有为我工作。我得到小数值。
当日期范围内有夏令时时,差异序列小数部分将低于.5或更高。当日期范围在3月15日进行日光节约时,十进制值> .5当日光离开日期十进制< 0.5。所以我只是将差异序列放在round()函数中,我得到了我需要的整数天数。