From daa5f4c385ff08b68b6e8ee34b26a8ce3211f16c Mon Sep 17 00:00:00 2001 From: Andreas Heigl Date: Tue, 19 Nov 2019 17:02:57 +0100 Subject: [PATCH 1/2] Add constants with milliseconds After a twitter-exchange with Dries Vints (https://twitter.com/driesvints/status/1196780528302776320) it looked like there should be a way to easily handle ISO8601- and RFC3339-related datetimes containing fractions. And after a bit of digging I realized that there already was a change done for RFC3339 by adding the microseconds. But the milliseconds where not yet part of the constants. This commit fixes that by adding new constants: * DATE_ATOM_FRACTION * DATE_RFC3339_FRACTION * DATE_ISO8601_FRACTION * DateTimeInterface::ATOM_FRACTION * DateTimeInterface::RFC3339_FRACTION * DateTimeInterface::ISO8601_FRACTION All these are based on their fraction-less counterparts and have added the ".u" modifier after the "s" and before the offset-notation --- ext/date/php_date.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/ext/date/php_date.c b/ext/date/php_date.c index e9b077ca1412c..3aa96bba344e7 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -503,8 +503,10 @@ PHP_RSHUTDOWN_FUNCTION(date) * date-time = full-date "T" full-time */ #define DATE_FORMAT_RFC3339 "Y-m-d\\TH:i:sP" +#define DATE_FORMAT_RFC3339_FRACTION "Y-m-d\\TH:i:s.uP" #define DATE_FORMAT_ISO8601 "Y-m-d\\TH:i:sO" +#define DATE_FORMAT_ISO8601_FRACTION "Y-m-d\\TH:i:s.uO" /* * RFC3339, Appendix A: http://www.ietf.org/rfc/rfc3339.txt @@ -541,6 +543,7 @@ PHP_MINIT_FUNCTION(date) * "Z" character MUST be present in the absence of a numeric time zone offset. */ REGISTER_STRING_CONSTANT("DATE_ATOM", DATE_FORMAT_RFC3339, CONST_CS | CONST_PERSISTENT); + REGISTER_STRING_CONSTNAT("DATE_ATOM_FRACTION", DATE_FORMAT_RFC3339_FRACTION, CONST_CS | CONST_PERSISTENT); /* * Preliminary specification: http://wp.netscape.com/newsref/std/cookie_spec.html * "This is based on RFC 822, RFC 850, RFC 1036, and RFC 1123, @@ -549,6 +552,7 @@ PHP_MINIT_FUNCTION(date) */ REGISTER_STRING_CONSTANT("DATE_COOKIE", DATE_FORMAT_COOKIE, CONST_CS | CONST_PERSISTENT); REGISTER_STRING_CONSTANT("DATE_ISO8601", DATE_FORMAT_ISO8601, CONST_CS | CONST_PERSISTENT); + REGISTER_STRING_CONSTANT("DATE_ISO8601_FRACTION", DATE_FORMAT_ISO8601_FRACTION, CONST_CS | CONST_PERSISTENT); REGISTER_STRING_CONSTANT("DATE_RFC822", DATE_FORMAT_RFC822, CONST_CS | CONST_PERSISTENT); REGISTER_STRING_CONSTANT("DATE_RFC850", DATE_FORMAT_RFC850, CONST_CS | CONST_PERSISTENT); @@ -558,6 +562,7 @@ PHP_MINIT_FUNCTION(date) REGISTER_STRING_CONSTANT("DATE_RFC2822", DATE_FORMAT_RFC2822, CONST_CS | CONST_PERSISTENT); REGISTER_STRING_CONSTANT("DATE_RFC3339", DATE_FORMAT_RFC3339, CONST_CS | CONST_PERSISTENT); REGISTER_STRING_CONSTANT("DATE_RFC3339_EXTENDED", DATE_FORMAT_RFC3339_EXTENDED, CONST_CS | CONST_PERSISTENT); + REGISTER_STRING_CONSTANT("DATE_RFC3339_FRACTION", DATE_FORMAT_RFC3339_FRACTION, CONST_CS | CONST_PERSISTENT); /* * RSS 2.0 Specification: http://blogs.law.harvard.edu/tech/rss @@ -1749,8 +1754,10 @@ static void date_register_classes(void) /* {{{ */ zend_declare_class_constant_stringl(date_ce_interface, const_name, sizeof(const_name)-1, value, sizeof(value)-1); REGISTER_DATE_INTERFACE_CONST_STRING("ATOM", DATE_FORMAT_RFC3339); + REGISTER_DATE_INTERFACE_CONST_STRING("ATOM_FRACTION", DATE_FORMAT_RFC3339_FRACTION); REGISTER_DATE_INTERFACE_CONST_STRING("COOKIE", DATE_FORMAT_COOKIE); REGISTER_DATE_INTERFACE_CONST_STRING("ISO8601", DATE_FORMAT_ISO8601); + REGISTER_DATE_INTERFACE_CONST_STRING("ISO8601_FRACTION", DATE_FORMAT_ISO8601_FRACTION); REGISTER_DATE_INTERFACE_CONST_STRING("RFC822", DATE_FORMAT_RFC822); REGISTER_DATE_INTERFACE_CONST_STRING("RFC850", DATE_FORMAT_RFC850); REGISTER_DATE_INTERFACE_CONST_STRING("RFC1036", DATE_FORMAT_RFC1036); @@ -1759,6 +1766,7 @@ static void date_register_classes(void) /* {{{ */ REGISTER_DATE_INTERFACE_CONST_STRING("RFC2822", DATE_FORMAT_RFC2822); REGISTER_DATE_INTERFACE_CONST_STRING("RFC3339", DATE_FORMAT_RFC3339); REGISTER_DATE_INTERFACE_CONST_STRING("RFC3339_EXTENDED", DATE_FORMAT_RFC3339_EXTENDED); + REGISTER_DATE_INTERFACE_CONST_STRING("RFC3339_FRACTION", DATE_FORMAT_RFC3339_FRACTION); REGISTER_DATE_INTERFACE_CONST_STRING("RSS", DATE_FORMAT_RFC1123); REGISTER_DATE_INTERFACE_CONST_STRING("W3C", DATE_FORMAT_RFC3339); From d9679fcb28b79e56299acacf97ffa7841d27aade Mon Sep 17 00:00:00 2001 From: Andreas Heigl Date: Tue, 19 Nov 2019 17:55:27 +0100 Subject: [PATCH 2/2] Add some tests for new date-constants --- ext/date/php_date.c | 2 +- .../tests/DateTimeInterface_constants.phpt | 28 +++++++++++-------- ext/date/tests/DateTime_constants.phpt | 28 +++++++++++-------- ext/date/tests/DateTime_format_basic2.phpt | 10 +++++-- 4 files changed, 43 insertions(+), 25 deletions(-) diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 3aa96bba344e7..3b54fac00e492 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -543,7 +543,7 @@ PHP_MINIT_FUNCTION(date) * "Z" character MUST be present in the absence of a numeric time zone offset. */ REGISTER_STRING_CONSTANT("DATE_ATOM", DATE_FORMAT_RFC3339, CONST_CS | CONST_PERSISTENT); - REGISTER_STRING_CONSTNAT("DATE_ATOM_FRACTION", DATE_FORMAT_RFC3339_FRACTION, CONST_CS | CONST_PERSISTENT); + REGISTER_STRING_CONSTANT("DATE_ATOM_FRACTION", DATE_FORMAT_RFC3339_FRACTION, CONST_CS | CONST_PERSISTENT); /* * Preliminary specification: http://wp.netscape.com/newsref/std/cookie_spec.html * "This is based on RFC 822, RFC 850, RFC 1036, and RFC 1123, diff --git a/ext/date/tests/DateTimeInterface_constants.phpt b/ext/date/tests/DateTimeInterface_constants.phpt index 972714c3172eb..27f3125900a49 100644 --- a/ext/date/tests/DateTimeInterface_constants.phpt +++ b/ext/date/tests/DateTimeInterface_constants.phpt @@ -4,17 +4,20 @@ DateTimeInterface constants @@ -30,3 +33,6 @@ bool(true) bool(true) bool(true) bool(true) +bool(true) +bool(true) +bool(true) diff --git a/ext/date/tests/DateTime_constants.phpt b/ext/date/tests/DateTime_constants.phpt index 44e840176eae2..7b02f40664336 100644 --- a/ext/date/tests/DateTime_constants.phpt +++ b/ext/date/tests/DateTime_constants.phpt @@ -4,17 +4,20 @@ DateTime constants @@ -30,3 +33,6 @@ bool(true) bool(true) bool(true) bool(true) +bool(true) +bool(true) +bool(true) diff --git a/ext/date/tests/DateTime_format_basic2.phpt b/ext/date/tests/DateTime_format_basic2.phpt index fa5c1a24be880..2c408ff0acf31 100644 --- a/ext/date/tests/DateTime_format_basic2.phpt +++ b/ext/date/tests/DateTime_format_basic2.phpt @@ -12,17 +12,20 @@ Test date_format() function : basic functionality date_default_timezone_set("Europe/London"); echo "*** Testing date_format() : basic functionality - formatting coinstants ***\n"; -$date = new DateTime("2005-07-14 22:30:41"); +$date = new DateTime("2005-07-14 22:30:41.123456"); var_dump( $date->format( DateTime::ATOM) ) ; +var_dump( $date->format( DateTime::ATOM_FRACTION) ) ; var_dump( $date->format( DateTime::COOKIE) ) ; var_dump( $date->format( DateTime::ISO8601) ) ; +var_dump( $date->format( DateTime::ISO8601_FRACTION) ) ; var_dump( $date->format( DateTime::RFC822) ) ; var_dump( $date->format( DateTime::RFC850) ) ; var_dump( $date->format( DateTime::RFC1036) ) ; var_dump( $date->format( DateTime::RFC1123) ) ; -var_dump( $date->format( DateTime:: RFC2822) ) ; +var_dump( $date->format( DateTime::RFC2822) ) ; var_dump( $date->format( DateTime::RFC3339) ) ; +var_dump( $date->format( DateTime::RFC3339_FRACTION) ) ; var_dump( $date->format( DateTime::RSS) ) ; var_dump( $date->format( DateTime::W3C) ) ; @@ -30,13 +33,16 @@ var_dump( $date->format( DateTime::W3C) ) ; --EXPECT-- *** Testing date_format() : basic functionality - formatting coinstants *** string(25) "2005-07-14T22:30:41+01:00" +string(32) "2005-07-14T22:30:41.123456+01:00" string(34) "Thursday, 14-Jul-2005 22:30:41 BST" string(24) "2005-07-14T22:30:41+0100" +string(31) "2005-07-14T22:30:41.123456+0100" string(29) "Thu, 14 Jul 05 22:30:41 +0100" string(32) "Thursday, 14-Jul-05 22:30:41 BST" string(29) "Thu, 14 Jul 05 22:30:41 +0100" string(31) "Thu, 14 Jul 2005 22:30:41 +0100" string(31) "Thu, 14 Jul 2005 22:30:41 +0100" string(25) "2005-07-14T22:30:41+01:00" +string(32) "2005-07-14T22:30:41.123456+01:00" string(31) "Thu, 14 Jul 2005 22:30:41 +0100" string(25) "2005-07-14T22:30:41+01:00"