在DateTime diff方法中处理夏令时

时间:2016-10-28 17:15:07

标签: php datetime

我使用以下功能检查两个日期之间的天数差异

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'

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

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

我的问题是:如何避免这种类型的错误,但保留我的默认时区?

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

1 个答案:

答案 0 :(得分:1)

将DateTime的时区设置为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;
}