Bug #74885 [Asn]: Wrong behaviour when comparing dates with microseconds
Edit report at https://bugs.php.net/bug.php?id=74885&edit=1
ID: 74885
Updated by: derick@php.net
Reported by: marcospassos dot com at gmail dot com
Summary: Wrong behaviour when comparing dates with
microseconds
Status: Assigned
Type: Bug
Package: Date/time related
PHP Version: 7.1.7
Assigned To: derick
Block user comment: N
Private report: N
New Comment:
@nikic - Why? That's a good question that I don't have an answer to. The problem with
changing it now is that it is an API break in the library :-/
Previous Comments:
------------------------------------------------------------------------
[2017-07-09 16:00:25] requinix@php.net
Because most of the code supporting DateTime is actually a library.
https://github.com/derickr/timelib
If you missed it, @nikic had just asked @derick about why microseconds are floating-point, so
let's step back and let them work.
------------------------------------------------------------------------
[2017-07-09 15:49:52] marcospassos dot com at gmail dot com
I can't understand why it's internally stored as float, neither why DateInverval exposes
the f property as float, once microseconds cannot be expressed as a fraction in PHP.
------------------------------------------------------------------------
[2017-07-09 15:30:35] requinix@php.net
That may work for your example but it does not work in the general case.
https://3v4l.org/c54Dt
The problem is not in how the DateTime is modified but in how it is compared. Specifically, in how
the microseconds values are compared. As things stand, if you require microsecond-level precision
then you must use your own custom comparison strategy.
------------------------------------------------------------------------
[2017-07-09 15:14:12] marcospassos dot com at gmail dot com
@requinix yes, sure. However, this is so because it's how PHPUnit handles DateTime comparison,
and how I came up with this issue.
A better workaround for those facing the same issue:
// 1000000 microseconds (1 second):
// https://bugs.php.net/bug.php?id=74885
// @todo Remove it when this bug get fixed
$microseconds = $this->microseconds % 1000000;
$seconds = intval($this->microseconds / 1000000);
return $date->modify(
sprintf('%d seconds %d microseconds', $seconds, $microseconds)
);
------------------------------------------------------------------------
[2017-07-09 15:04:09] nikic@php.net
@derick: Why are the microseconds being stored as a floating point fraction? Can we store them as
integer microseconds instead? I remember seeing some other bug reports also relating to float
precision issues with the microseconds.
------------------------------------------------------------------------
The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
https://bugs.php.net/bug.php?id=74885
--
Edit this bug report at https://bugs.php.net/bug.php?id=74885&edit=1
Thread (10 messages)