From 6715bb38bdd326cc89646a4d178215136dca9d1c Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Tue, 31 Jan 2006 18:41:45 +0000 Subject: [PATCH] - Fixed bug #36224: date(DATE_ATOM) gives wrong results --- ext/date/php_date.c | 12 +++++++++--- ext/date/tests/bug36224.phpt | 13 +++++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) create mode 100644 ext/date/tests/bug36224.phpt diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 01decd9167..b3f8a1e546 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -241,6 +241,7 @@ PHP_RSHUTDOWN_FUNCTION(date) #define DATE_TIMEZONEDB php_date_global_timezone_db ? php_date_global_timezone_db : timelib_builtin_db() +#define DATE_FORMAT_RFC3339 "Y-m-d\\TH:i:sP" #define DATE_FORMAT_ISO8601 "Y-m-d\\TH:i:sO" #define DATE_FORMAT_RFC1036 "l, d-M-y H:i:s T" #define DATE_FORMAT_RFC1123 "D, d M Y H:i:s T" @@ -266,7 +267,7 @@ PHP_MINIT_FUNCTION(date) date_register_classes(TSRMLS_C); - REGISTER_STRING_CONSTANT("DATE_ATOM", DATE_FORMAT_ISO8601, CONST_CS | CONST_PERSISTENT); + REGISTER_STRING_CONSTANT("DATE_ATOM", DATE_FORMAT_RFC3339, CONST_CS | CONST_PERSISTENT); REGISTER_STRING_CONSTANT("DATE_COOKIE", DATE_FORMAT_RFC1123, CONST_CS | CONST_PERSISTENT); REGISTER_STRING_CONSTANT("DATE_ISO8601", DATE_FORMAT_ISO8601, CONST_CS | CONST_PERSISTENT); REGISTER_STRING_CONSTANT("DATE_RFC822", DATE_FORMAT_RFC1123, CONST_CS | CONST_PERSISTENT); @@ -274,6 +275,7 @@ PHP_MINIT_FUNCTION(date) REGISTER_STRING_CONSTANT("DATE_RFC1036", DATE_FORMAT_RFC1036, CONST_CS | CONST_PERSISTENT); REGISTER_STRING_CONSTANT("DATE_RFC1123", DATE_FORMAT_RFC1123, CONST_CS | CONST_PERSISTENT); 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_RSS", DATE_FORMAT_RFC1123, CONST_CS | CONST_PERSISTENT); REGISTER_STRING_CONSTANT("DATE_W3C", DATE_FORMAT_ISO8601, CONST_CS | CONST_PERSISTENT); @@ -561,6 +563,7 @@ static char *date_format(char *format, int format_len, int *return_len, timelib_ timelib_time_offset *offset; timelib_sll isoweek, isoyear; php_locale_data *loc_dat; + int rfc_colon = 0; if (!format_len) { if (UG(unicode)) { @@ -645,9 +648,11 @@ static char *date_format(char *format, int format_len, int *return_len, timelib_ /* timezone */ case 'I': length = date_spprintf(&buffer, 32 TSRMLS_CC, "%d", localtime ? offset->is_dst : 0); break; - case 'O': length = date_spprintf(&buffer, 32 TSRMLS_CC, "%c%02d%02d", + case 'P': rfc_colon = 1; /* break intentionally missing */ + case 'O': length = date_spprintf(&buffer, 32 TSRMLS_CC, "%c%02d%s%02d", localtime ? ((offset->offset < 0) ? '-' : '+') : '+', localtime ? abs(offset->offset / 3600) : 0, + rfc_colon ? ":" : "", localtime ? abs((offset->offset % 3600) / 60) : 0 ); break; @@ -1326,7 +1331,7 @@ static void date_register_classes(TSRMLS_D) #define REGISTER_DATE_CLASS_CONST_STRING(const_name, value) \ zend_declare_class_constant_stringl(date_ce_date, const_name, sizeof(const_name)-1, value, sizeof(value)-1 TSRMLS_CC); - REGISTER_DATE_CLASS_CONST_STRING("ATOM", DATE_FORMAT_ISO8601); + REGISTER_DATE_CLASS_CONST_STRING("ATOM", DATE_FORMAT_RFC3339); REGISTER_DATE_CLASS_CONST_STRING("COOKIE", DATE_FORMAT_RFC1123); REGISTER_DATE_CLASS_CONST_STRING("ISO8601", DATE_FORMAT_ISO8601); REGISTER_DATE_CLASS_CONST_STRING("RFC822", DATE_FORMAT_RFC1123); @@ -1334,6 +1339,7 @@ static void date_register_classes(TSRMLS_D) REGISTER_DATE_CLASS_CONST_STRING("RFC1036", DATE_FORMAT_RFC1036); REGISTER_DATE_CLASS_CONST_STRING("RFC1123", DATE_FORMAT_RFC1123); REGISTER_DATE_CLASS_CONST_STRING("RFC2822", DATE_FORMAT_RFC2822); + REGISTER_DATE_CLASS_CONST_STRING("RFC3339", DATE_FORMAT_RFC2822); REGISTER_DATE_CLASS_CONST_STRING("RSS", DATE_FORMAT_RFC1123); REGISTER_DATE_CLASS_CONST_STRING("W3C", DATE_FORMAT_ISO8601); diff --git a/ext/date/tests/bug36224.phpt b/ext/date/tests/bug36224.phpt new file mode 100644 index 0000000000..1690f4e7b2 --- /dev/null +++ b/ext/date/tests/bug36224.phpt @@ -0,0 +1,13 @@ +--TEST-- +Bug #36224 (date(DATE_ATOM) gives wrong resulsts) +--FILE-- + +--EXPECT-- +2006-01-31T20:23:56+01:00 +2006-01-31T19:23:56+01:00 -- 2.40.0