Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:奇怪的日期间隔长度计算_Php_Dateinterval - Fatal编程技术网

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时,我尝试了以下内容:

<?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);
}