PHP日期间隔错误与夏令时

时间:2018-02-15 07:24:55

标签: php

在尝试计算两个日期之间的天数时,我遇到了一个问题。如果开始日期在夏令时开关之前,则天数计算不正确。

以下是重现错误的快速测试:

/**
 * @dataProvider daysProvider
 */
public function testDays($start, $end, $expectedDays)
{
    $startDate = new \DateTime($start);
    $endDate = new \DateTime($end);
    $interval = $startDate->diff($endDate);
    $this->assertEquals($expectedDays, $interval->format('%a'));
}

/**
 * @dataProvider daysProvider
 */
public function testDaysSydney($start, $end, $expectedDays)
{
    $startDate = new \DateTime($start);
    $endDate = new \DateTime($end);
    $startDate->setTimezone(new \DateTimeZone('Australia/Sydney'));
    $endDate->setTimezone(new \DateTimeZone('Australia/Sydney'));
    $interval = $startDate->diff($endDate);
    $this->assertEquals($expectedDays, $interval->format('%a'));
}

public function daysProvider()
{
    return [
        ['2016-03-01', '2016-03-04', 3],
        ['2016-04-01', '2016-04-04', 3],
    ];
}

输出:

PHPUnit 6.5.5 by Sebastian Bergmann and contributors.

...F

Time: 23 ms, Memory: 4.00MB

There was 1 failure:

1) TimingTest::testDaysSydney with data set #1 ('2016-04-01', '2016-04-04', 3)
Failed asserting that '2' matches expected 3.

我确实找到了这个错误报告:https://bugs.php.net/bug.php?id=63953但显然这个问题应该修复。

对此有任何解决方法吗?感谢

2 个答案:

答案 0 :(得分:1)

通过DateTimeZone setter方法(DateTime)设置setTimezone并通过DateTime构造函数设置它(如this question中所述)之间存在差异。 尝试通过构造函数设置时区:

public function testDaysSydney($start, $end, $expectedDays)
{
    $tz=new \DateTimeZone('Australia/Sydney');
    $startDate = new \DateTime($start, $tz);
    $endDate = new \DateTime($end, $tz);
    $interval = $startDate->diff($endDate);
    $this->assertEquals($expectedDays, $interval->format('%a'));
}

答案 1 :(得分:0)

确保您使用正确的时间。

1)一种方法是将PHP中的时区设置为php.ini中的GMT或UTC,或者使用date_default_timezone_set()。这就是你正在尝试的

2)另一种方法是使用gmdate()代替date()