From 6715bb38bdd326cc89646a4d178215136dca9d1c Mon Sep 17 00:00:00 2001
From: Derick Rethans <derick@php.net>
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--
+<?php
+date_default_timezone_set("Europe/Oslo");
+
+echo date(DATE_ATOM, strtotime('2006-01-31T19:23:56Z')) . "\n";
+echo date(DATE_ATOM, strtotime('2006-01-31T19:23:56')) . "\n";
+
+?>
+--EXPECT--
+2006-01-31T20:23:56+01:00
+2006-01-31T19:23:56+01:00
-- 
2.40.0