|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2020-04-06 01:22 UTC] corey dot taylor dot fl at gmail dot com
Description:
------------
If you create DateTime instances in 'America/New_York' or 'UTC' time zone and compare them using DateTime::diff() the `months` value is different than using DateTime instances in 'Europe/Berlin' or 'Asia/Tokyo'.
date_default_timezone_set('America/New_York');
$from = new DateTime('2019-06-01');
$to = new DateTime('2019-10-01');
var_dump($from->diff($to)->m);
-- int(4)
date_default_timezone_set('Asia/Tokyo');
$from = new DateTime('2019-06-01');
$to = new DateTime('2019-10-01');
var_dump($from->diff($to)->m);
-- int(3)
The generated `days` value is the same for both.
If this isn't determined to be an implementation error, then can the exepcation be documented for DateTime::diff()? Right now, it's impossible to tell how the DateTime objects are compared between time zones.
Expected result:
----------------
The generated difference in months is the same for 2 dates is the same regardless of the time zone they are in.
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Thu Oct 30 18:00:02 2025 UTC |
the error lies in the evaluation of +1 month from a date that begins at the end of May 31 since php calculates from the current month it takes initially 31 days on July 1 is the second month while it should be the third month. It should only calculate the time spent in months without days. <?php date_default_timezone_set('America/New_York'); $from = new DateTime('2019-06-01'); $to = new DateTime('2019-10-01'); var_dump($from->diff($to)->m); date_default_timezone_set('Asia/Tokyo'); $from = new DateTime('2019-06-01'); $from->setTimezone(new DateTimeZone('UTC')); // 2019-05-31 15:00:00 $to = new DateTime('2019-10-01'); $to->setTimezone(new DateTimeZone('UTC')); // 2019-09-30 15:00:00 // 4 month for php 2019-10-01 15:00:00 var_dump(($from->diff($to)->m), $from, $to);