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
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
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: Fri Nov 22 00:01:30 2024 UTC