[英]DateTime::diff unexpected results
我有以下計算,我希望返回0。但是在我可以訪問的許多系統上,它返回1。
Ubuntu 16.04服務器(錯誤)
php -v
PHP 7.0.22-0ubuntu0.16.04.1 (cli) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
with Zend OPcache v7.0.22-0ubuntu0.16.04.1, Copyright (c) 1999-
2017, by Zend Technologies
echo "<?php echo DateTime::createFromFormat('Y-m-d H:i:s', '2017-12-01 00:00:00')->diff(DateTime::createFromFormat('Y-m-d H:i:s', '2017-12-31 23:59:59' ))->format('%m');"|php
1
來自deb.sury.org的PHP 7.1和Xdebug(錯誤)
php -v
PHP 7.1.6-1~ubuntu16.04.1+deb.sury.org+1 (cli) (built: Jun 9 2017
08:26:34) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
with Zend OPcache v7.1.6-1~ubuntu16.04.1+deb.sury.org+1, Copyright
(c) 1999-2017, by Zend Technologies
with Xdebug v2.5.4, Copyright (c) 2002-2017, by Derick Rethans
echo "<?php echo DateTime::createFromFormat('Y-m-d H:i:s', '2017-12-01 00:00:00')->diff(DateTime::createFromFormat('Y-m-d H:i:s', '2017-12-31 23:59:59' ))->format('%m');"|php
1
phpfiddle.org
->按預期返回0
日期的時區相同
DateInterval::format
注釋:
DateInterval :: format()方法不會重新計算時間字符串或日期段中的結轉點。 這是可以預期的,因為不可能溢出“ 32天”之類的值,該值可以解釋為從“ 1個月4天”到“ 1個月1天”的任何值。
因此,必須重新計算結轉點。 以下是DateInterval::format
的相關代碼 :
class DateIntervalEnhanced extends DateInterval {
public function recalculate() {
$from = new DateTime;
$to = clone $from;
$to->add($this);
$diff = $from->diff($to);
foreach ($diff as $k => $v) $this->$k = $v;
return $this;
}
}
實用功能:
function myFormatter($d1, $d2, $format) {
$diff = strtotime($d1) - strtotime($d2);
$df = abs($diff);
$di = new DateIntervalEnhanced("PT${df}S");
$di->invert = $diff < 0;
return $di->recalculate()->format($format);
}
echo myFormatter("2017-12-31 23:59:59", "2017-12-01 00:00:00", "%m");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.