diff options
author | Remi Collet <remi@php.net> | 2012-12-01 10:20:39 +0100 |
---|---|---|
committer | Remi Collet <remi@php.net> | 2012-12-01 10:20:39 +0100 |
commit | c2554b4bb43700ae16db34d9706db1db85ec78a4 (patch) | |
tree | 3a1ddaed4dda8eb654f72bf7f9bd0320f7b389e6 | |
parent | ff6c9e2726ab724707999ed651d1a414336665f2 (diff) | |
download | php-git-c2554b4bb43700ae16db34d9706db1db85ec78a4.tar.gz |
Fixed Bug #63435 Datetime::format('u') sometimes wrong by 1 microsecond
When storing '015700' microseconds in a Datetime object,
Datetime::format('u') returns '015699'
Already known per bug45554 reproducer (also fixed).
-rw-r--r-- | ext/date/php_date.c | 2 | ||||
-rw-r--r-- | ext/date/tests/bug45554.phpt | 4 | ||||
-rw-r--r-- | ext/date/tests/bug63435.phpt | 16 |
3 files changed, 19 insertions, 3 deletions
diff --git a/ext/date/php_date.c b/ext/date/php_date.c index e8a457052e..47b79bc250 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -1095,7 +1095,7 @@ static char *date_format(char *format, int format_len, timelib_time *t, int loca case 'H': length = slprintf(buffer, 32, "%02d", (int) t->h); break; case 'i': length = slprintf(buffer, 32, "%02d", (int) t->i); break; case 's': length = slprintf(buffer, 32, "%02d", (int) t->s); break; - case 'u': length = slprintf(buffer, 32, "%06d", (int) floor(t->f * 1000000)); break; + case 'u': length = slprintf(buffer, 32, "%06d", (int) floor(t->f * 1000000 + 0.5)); break; /* timezone */ case 'I': length = slprintf(buffer, 32, "%d", localtime ? offset->is_dst : 0); break; diff --git a/ext/date/tests/bug45554.phpt b/ext/date/tests/bug45554.phpt index 0e9ebfd140..a5042ffb1c 100644 --- a/ext/date/tests/bug45554.phpt +++ b/ext/date/tests/bug45554.phpt @@ -9,12 +9,12 @@ $d = date_create_from_format($format, "03-15-2005 12:22:29.000000 PST"); echo $d->format($format), "\n"; $d = date_create_from_format($format, "03-15-2005 12:22:29.001001 PST"); -echo $d->format($format), " (precision isn't enough to show the 1 here)\n"; +echo $d->format($format), "\n"; $d = date_create_from_format($format, "03-15-2005 12:22:29.0010 PST"); echo $d->format($format), "\n"; ?> --EXPECT-- 03-15-2005 12:22:29.000000 PST -03-15-2005 12:22:29.001000 PST (precision isn't enough to show the 1 here) +03-15-2005 12:22:29.001001 PST 03-15-2005 12:22:29.001000 PST diff --git a/ext/date/tests/bug63435.phpt b/ext/date/tests/bug63435.phpt new file mode 100644 index 0000000000..dcec6e46e7 --- /dev/null +++ b/ext/date/tests/bug63435.phpt @@ -0,0 +1,16 @@ +--TEST-- +Bug #63435 Datetime::format('u') sometimes wrong by 1 microsecond +--INI-- +date.timezone=UTC +--FILE-- +<?php +for ($i=1 ; $i<999 ; $i++) { + $datetime = Datetime::createFromFormat("u", sprintf("%06ld", $i)); + $res = $datetime->format("u"); + if ($res != $i) { + echo "$i != $res\n"; + } +} +echo "Done"; +--EXPECT-- +Done |