2016-10-28 54 views
0

我使用下面的函数来检查两个日期在日期时间差异法夏天的时间来处理

function calcNumberOfNights ($checkin, $checkout) 
{ 
    $checkinDate = new DateTime($checkin); 
    $checkoutDate = new DateTime($checkout); 
    $interval = $checkoutDate->diff($checkinDate); 
    return $interval->days; 
} 

为了测试之间的天差,我用下面的代码

$in = '2016-10-15'; 
$out = '2016-10-18'; 
var_dump(calcNumberOfNights($in,$out));//print '3' 

所有的工作都很好,除非我试图计算10月16日到10月18日之间的时间间隔。

$in = '2016-10-16'; 
$out = '2016-10-18'; 
var_dump(calcNumberOfNights($in,$out)); //print '1' 

它返回1,当在这种情况下正确的输出应该是'2'。

我认为问题出在时区。它使用巴西时区,2016年10月16日是巴西夏季的第一天(加上一小时)。

我的问题是:我怎样才能避免这种类型的错误,但保持我的默认时区?

我在SO搜索了类似的问题,但没有找到任何东西。

+1

问题像这样的我把我的服务器的时区和所有的时间计算为UTC的原因。我只转换为用户时区进行演示。 – vascowhite

回答

1

设置时区为UTC您的日期时间:

function calcNumberOfNights ($checkin, $checkout) 
{ 
    $timezone = new DateTimeZone('UTC'); 
    $checkinDate = new DateTime($checkin, $timezone); 
    $checkoutDate = new DateTime($checkout, $timezone); 
    $interval = $checkoutDate->diff($checkinDate); 
    return $interval->days; 
}