在尝试计算两个日期之间的天数时,我遇到了一个问题。如果开始日期在夏令时开关之前,则天数计算不正确。
以下是重现错误的快速测试:
/**
* @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但显然这个问题应该修复。
对此有任何解决方法吗?感谢
答案 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()
。