]> granicus.if.org Git - php/commitdiff
Fixed Bug #63435 Datetime::format('u') sometimes wrong by 1 microsecond
authorRemi Collet <remi@php.net>
Sat, 1 Dec 2012 09:20:39 +0000 (10:20 +0100)
committerRemi Collet <remi@php.net>
Sat, 1 Dec 2012 09:20:39 +0000 (10:20 +0100)
When storing '015700' microseconds in a Datetime object,
Datetime::format('u') returns '015699'

Already known per bug45554 reproducer (also fixed).

ext/date/php_date.c
ext/date/tests/bug45554.phpt
ext/date/tests/bug63435.phpt [new file with mode: 0644]

index e8a457052ec45de53f1c4b2f8f0f9727f804aa47..47b79bc2501e5efb2377a21a52dc02a1c0294c66 100644 (file)
@@ -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;
index 0e9ebfd140366ca6569e76e9f5ca37d5aa87ce2a..a5042ffb1c65a113a3e9a280a960830f4f952f50 100644 (file)
@@ -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 (file)
index 0000000..dcec6e4
--- /dev/null
@@ -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