Re: [PHP] Strange Result of Datetime::diff

[email protected] (Ivan Grigoriev)
Newsgroups php.general
Message-ID <[email protected]>
03.04.2017 18:44, Christoph M. Becker пишет:
> On 03.04.2017 at 15:28, Aziz Saleh wrote:
>
>> On Mon, Apr 3, 2017 at 8:39 AM, <[email protected]> wrote:
>>
>>> I'd expect the following script:
>>>
>>> <?php
>>>
>>> $date1 = new DateTime('2017-03-01');
>>> $date2 = new DateTime('2017-04-02');
>>>
>>> $diff = $date1->diff($date2);
>>>
>>> echo "{$diff->m} months and {$diff->d} days.";
>>> ?>
>>>
>>> would print "1 months and 0 days.". But instead it prints "1 months and 3
>>> days." (see https://3v4l.org/RMuUZ).
>>> What is the reason for this behaviour?
>>
>> You sure about that, the above should yield 1 months and 1 days since you
>> have an extra day there:
>>
>> http://sandbox.onlinephpfunctions.com/code/fe7c7d989101ab5e1dd1530d457bfcc7a1cfa8fa
>
> But see <https://3v4l.org/N5fg7>!
>
Please, read this: <https://bugs.php.net/bug.php?id=52480>.
DateTime::diff works with UTC timezone. So, it converts current DateTime 
object to UTC timezone.

If you want to understand how it calculated, do
$date1->setTimeZone(new DateTimeZone('UTC'));
$date2->setTimeZone(new DateTimeZone('UTC'));
and watch what actual values are used in diff.

One of the ways to calculate difference is to use timezone UTC for 
DateTime object
$date1 = new DateTime('2017-03-01', new DateTimeZone('UTC'));
It calculates difference without time shifts and DTS rules.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.