php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Request #70381 Support comparing DateInterval objects
Submitted: 2015-08-28 10:48 UTC Modified: 2017-03-24 06:37 UTC
From: accido at ukr dot net Assigned:
Status: Duplicate Package: Date/time related
PHP Version: 5.6.13RC1 OS: Xubuntu 14
Private report: No CVE-ID: None
View Developer Edit
Welcome! If you don't have a Git account, you can't do anything here.
If you reported this bug, you can edit this bug over here.
(description)
Block user comment
Status: Assign to:
Package:
Bug Type:
Summary:
From: accido at ukr dot net
New email:
PHP Version: OS:

 

 [2015-08-28 10:48 UTC] accido at ukr dot net
Description:
------------
Wrong DateInterval comparsion result

Test script:
---------------
$a = new DateTime('1981-10-10');
$b = new DateTime('1980-10-01');
$m = new DateInterval('P1M');
var_dump($a->diff($b) > $m);
//bool(false)



Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2015-08-28 11:45 UTC] requinix@php.net
-Summary: DateInterval comparsion wrong +Summary: Support comparing DateInterval objects -Type: Bug +Type: Feature/Change Request
 [2015-08-28 11:45 UTC] requinix@php.net
DateIntervals are not comparable. You can use ->days as a workaround.

https://3v4l.org/H7JsN
 [2015-09-10 13:54 UTC] john_zuk at wp dot pl
You can't use ->days as a workaround, because of:
http://php.net/manual/en/class.dateinterval.php#dateinterval.props.days
See: https://3v4l.org/nlH2v
 [2015-09-10 19:52 UTC] requinix@php.net
Ha, that's true. And it makes sense since it's not always possible to determine the number of days in an arbitrary interval. That could be a problem when trying to compare two DateIntervals in a general sense, though: what is P30D <=> P1M?

A better approach here would be to compare the start date + interval <=> end date.
 [2016-05-16 12:11 UTC] php dot net at anthonychambers dot co dot uk
I actually see this working back to 5.5.8 and up to 7.0.6 according to https://3v4l.org/TrPvp

The trick is that you have to inspect both intervals first. I just essentially did this:

var_export($interval1, true);
var_export($interval2, true);
var_export($interval1 < $interval2);

And that should work. If you don't check either of the intervals then you get different results:

* Check 0 = Always returns false
* Check 1 = Always returns true
* Check 2 = Returns correct values
 [2017-03-24 06:37 UTC] requinix@php.net
-Status: Open +Status: Duplicate
 [2017-03-24 06:37 UTC] requinix@php.net
I just became aware of request #49914.
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Sat Dec 07 05:01:29 2024 UTC