2009-04-29 100 views
1

我试图计算两天之间的天数,但我遇到夏令时问题。这里是我的代码:如何减去两个日期,忽略PHP中的夏令时?

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日期功能可能无法使用。)

更位信息:我要带偏移,并添加它与其他日期时间在一个分贝,我只想要一天的部分改变,而不是时间的一部分。原来四舍五入是行不通的,无论如何,因为当我添加它时,它会在另一个方向上停留一个小时。也许有一个更好的办法来解决整个问题......

回答

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"; 
} 
+0

在我的所有日​​期数学似乎工作之前添加此项: date_default_timezone_set('UTC'); – sprugman 2009-04-29 22:49:48

+0

使用date_default_timezone_set('UTC');是一个很好的方法来做到这一点。请注意,如果您的网页需要其他日期,则可能会导致其他日期的准确性产生副作用。如果您的网页上没有其他日期,请忽略此评论。 :-) – artlung 2009-04-29 23:04:22

7

部队的日期住进去时区没有夏令时间(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 
0

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

当在日期范围内有夏令时日期时,不同的串行小数部分将在.5或以上。当日期范围有日光节约时间为3/15时,十进制值为> .5当日光时间为十进制时< .5。所以我只是把差异序列放在一个round()函数中,我得到了我需要的整数。