-/* Generated by re2c 0.13.5 on Thu Dec 18 15:50:45 2008 */
+/* Generated by re2c 0.13.5 on Wed Jul 29 16:31:12 2009 */
#line 1 "ext/date/lib/parse_date.re"
/*
+----------------------------------------------------------------------+
- | PHP Version 6 |
+ | PHP Version 5 |
+----------------------------------------------------------------------+
| Copyright (c) 1997-2006 The PHP Group |
+----------------------------------------------------------------------+
add_pbf_error(s, "A two digit second could not be found", string, begin);
}
break;
- case 'u': /* five digit millisecond, with leading zero */
- TIMELIB_CHECK_NUMBER;
- if ((s->time->f = timelib_get_nr((char **) &ptr, 5)) == TIMELIB_UNSET) {
- add_pbf_error(s, "A five digit millisecond could not be found", string, begin);
+ case 'u': /* six digit millisecond */
+ {
+ double f;
+ char *tptr;
+
+ TIMELIB_CHECK_NUMBER;
+ tptr = ptr;
+ if ((f = timelib_get_nr((char **) &ptr, 6)) == TIMELIB_UNSET || ptr - tptr != 6) {
+ add_pbf_error(s, "A six digit millisecond could not be found", string, begin);
+ } else {
+ s->time->f = (f / 1000000);
+ }
}
break;
case ' ': /* any sort of whitespace (' ' and \t) */
add_pbf_error(s, "A two digit second could not be found", string, begin);
}
break;
- case 'u': /* five digit millisecond, with leading zero */
- TIMELIB_CHECK_NUMBER;
- if ((s->time->f = timelib_get_nr((char **) &ptr, 5)) == TIMELIB_UNSET) {
- add_pbf_error(s, "A five digit millisecond could not be found", string, begin);
+ case 'u': /* six digit millisecond */
+ {
+ double f;
+ char *tptr;
+
+ TIMELIB_CHECK_NUMBER;
+ tptr = ptr;
+ if ((f = timelib_get_nr((char **) &ptr, 6)) == TIMELIB_UNSET || ptr - tptr != 6) {
+ add_pbf_error(s, "A six digit millisecond could not be found", string, begin);
+ } else {
+ s->time->f = (f / 1000000);
+ }
}
break;
case ' ': /* any sort of whitespace (' ' and \t) */
--- /dev/null
+--TEST--
+Bug #45554 (Inconsistent behavior of the u format char)
+--INI--
+date.timezone=UTC
+--FILE--
+<?php
+$format = "m-d-Y H:i:s.u T";
+$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), "\n";
+
+$d = date_create_from_format($format, "03-15-2005 12:22:29.0010 PST");
+var_dump( $d );
+?>
+--EXPECT--
+03-15-2005 12:22:29.000000 PST
+03-15-2005 12:22:29.001000 PST
+bool(false)