]> granicus.if.org Git - php/commitdiff
Fixed #74298 - IntlDateFormatter->format() doesn't return microseconds/fractions
authorandrewnester <andrew.nester.dev@gmail.com>
Fri, 24 Mar 2017 16:23:15 +0000 (19:23 +0300)
committerNikita Popov <nikita.ppv@gmail.com>
Sun, 9 Apr 2017 10:56:21 +0000 (12:56 +0200)
NEWS
ext/intl/common/common_date.cpp
ext/intl/tests/bug74298.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index ab04592f7e78d790880a70bbec4369b58f164575..2fbfa00756878397a10a80078dffe565c705eefa 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -18,6 +18,8 @@ PHP                                                                        NEWS
 
 - Intl:
   . Fixed bug #65683 (Intl does not support DateTimeImmutable). (Ben Scholzen)
+  . Fixed bug #74298 (IntlDateFormatter->format() doesn't return
+    microseconds/fractions). (Andrew Nester)
 
 - OpenSSL:
   . Fixed bug #74341 (openssl_x509_parse fails to parse ASN.1 UTCTime without
index 98c6393a848c66cc9239e443f3dc458b44dbdc57..26c198bc4261d2c285e50e602ad6b401ab6fa9d5 100644 (file)
@@ -125,6 +125,8 @@ U_CFUNC int intl_datetime_decompose(zval *z, double *millis, TimeZone **tz,
        }
 
        if (millis) {
+               php_date_obj *datetime;
+
                ZVAL_STRING(&zfuncname, "getTimestamp");
                if (call_user_function(NULL, z, &zfuncname, &retval, 0, NULL)
                                != SUCCESS || Z_TYPE(retval) != IS_LONG) {
@@ -137,7 +139,8 @@ U_CFUNC int intl_datetime_decompose(zval *z, double *millis, TimeZone **tz,
                        return FAILURE;
                }
 
-               *millis = U_MILLIS_PER_SECOND * (double)Z_LVAL(retval);
+               datetime = Z_PHPDATE_P(z);
+               *millis = U_MILLIS_PER_SECOND * ((double)Z_LVAL(retval) + datetime->time->f);
                zval_ptr_dtor(&zfuncname);
        }
 
diff --git a/ext/intl/tests/bug74298.phpt b/ext/intl/tests/bug74298.phpt
new file mode 100644 (file)
index 0000000..0600a46
--- /dev/null
@@ -0,0 +1,30 @@
+--TEST--
+Bug #74298 (IntlDateFormatter->format() doesn't return microseconds/fractions)
+--SKIPIF--
+<?php if (!extension_loaded('intl')) print 'skip'; ?>
+--FILE--
+<?php
+var_dump((new \DateTime('2017-01-01 01:02:03.123456'))->format('Y-m-d\TH:i:s.u'));
+
+var_dump((new \IntlDateFormatter(
+    'en-US',
+    \IntlDateFormatter::FULL,
+    \IntlDateFormatter::FULL,
+    'UTC',
+    \IntlDateFormatter::GREGORIAN,
+    'yyyy-MM-dd HH:mm:ss.SSSSSS'
+))->format(new \DateTime('2017-01-01 01:02:03.123456')));
+
+var_dump(datefmt_create(
+    'en-US',
+    \IntlDateFormatter::FULL,
+    \IntlDateFormatter::FULL,
+    'UTC',
+    \IntlDateFormatter::GREGORIAN,
+    'yyyy-MM-dd HH:mm:ss.SSSSSS'
+)->format(new \DateTime('2017-01-01 01:02:03.123456')));
+?>
+--EXPECTF--
+string(26) "2017-01-01T01:02:03.123456"
+string(26) "2017-01-01 01:02:03.123000"
+string(26) "2017-01-01 01:02:03.123000"