PHP:奇怪的日期间隔长度计算
在使用PHP时,我尝试了以下内容:PHP:奇怪的日期间隔长度计算,php,dateinterval,Php,Dateinterval,在使用PHP时,我尝试了以下内容: <?php $FebruaryTheFirst = \DateTime::createFromFormat('Y-m-d H:i:s', '2001-02-01 00:00:00'); $MarchTheSecond = \DateTime::createFromFormat('Y-m-d H:i:s', '2001-03-01 00:00:00'); $interval = $FebruaryTheFirst->diff($MarchTheS
<?php
$FebruaryTheFirst = \DateTime::createFromFormat('Y-m-d H:i:s', '2001-02-01 00:00:00');
$MarchTheSecond = \DateTime::createFromFormat('Y-m-d H:i:s', '2001-03-01 00:00:00');
$interval = $FebruaryTheFirst->diff($MarchTheSecond);
echo $interval->m.PHP_EOL; // Outputs 0. WTF?
$FebruaryTheFirstbis = \DateTime::createFromFormat('Y-m-d', '2001-02-01');
$MarchTheSecondbis = \DateTime::createFromFormat('Y-m-d', '2001-03-01');
$interval2 = $FebruaryTheFirstbis->diff($MarchTheSecondbis);
echo $interval2->m.PHP_EOL; // Outputs 1. WTF?
$FebruaryTheFirstter = \DateTime::createFromFormat('Y-m-d H:i:s', '2001-02-01 00:01:00');
$MarchTheSecondter = \DateTime::createFromFormat('Y-m-d H:i:s', '2001-03-02 00:01:00');
$interval3 = $FebruaryTheFirstter->diff($MarchTheSecondter);
echo $interval3->m.PHP_EOL; // Outputs 0. WTF?
$FebruaryTheFirstfour = \DateTime::createFromFormat('Y-m-d H:i:s', '2001-02-01 01:00:00');
$MarchTheSecondfour = \DateTime::createFromFormat('Y-m-d H:i:s', '2001-03-02 01:00:00');
$interval4 = $FebruaryTheFirstfour->diff($MarchTheSecondfour);
echo $interval4->m.PHP_EOL; // Outputs 1. WTF?
看起来这是PHP中的一个已知错误。看一看这张照片。解决这个问题的唯一方法,至少目前是,在UTC中工作以消除本地时区问题 示例:
// Get the current timezone.
$originalTimezone = @date_default_timezone_get();
// Work in UTC.
date_default_timezone_set('UTC');
// ...
$dateStart = new DateTime('2001-02-01');
$dateEnd = new DateTime('2001-03-01');
$interval = $dateStart->diff($dateEnd);
// Reset the timezone.
if ($originalTimezone) {
date_default_timezone_set($originalTimezone);
}
你的问题是什么exactly@Topener:我进行了更精确的编辑。我的问题是,为什么输出会发生变化,而参数却没有变化。我无法在5.3.6和5.4.0-rc7上完全复制这种行为,1。@ClementHerreman-问题似乎与时区有关。当我使用我的本地时区(美国/温哥华)时,它对所有4个时区输出1,但当我使用不同的时区(澳大利亚/悉尼)时,它输出0。我现在没有时间研究这个问题,但我希望这能为你指明正确的方向。看一看,看一看。我看起来也像是有人在网站上留言说这是不准确的。谢谢@Francois,看到2010年的一个bug还在PHP代码中捣乱,我很难过:/@ClementHerreman-me也一样。直到今天我都不知道这个bug的存在,因为它不会影响我。我希望他们能尽快修好。
// Get the current timezone.
$originalTimezone = @date_default_timezone_get();
// Work in UTC.
date_default_timezone_set('UTC');
// ...
$dateStart = new DateTime('2001-02-01');
$dateEnd = new DateTime('2001-03-01');
$interval = $dateStart->diff($dateEnd);
// Reset the timezone.
if ($originalTimezone) {
date_default_timezone_set($originalTimezone);
}