summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRemi Collet <remi@php.net>2012-12-01 10:20:39 +0100
committerRemi Collet <remi@php.net>2012-12-01 10:20:39 +0100
commitc2554b4bb43700ae16db34d9706db1db85ec78a4 (patch)
tree3a1ddaed4dda8eb654f72bf7f9bd0320f7b389e6
parentff6c9e2726ab724707999ed651d1a414336665f2 (diff)
downloadphp-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.c2
-rw-r--r--ext/date/tests/bug45554.phpt4
-rw-r--r--ext/date/tests/bug63435.phpt16
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