Skip to content

Commit 0249f6b

Browse files
author
Derick Rethans
committed
- MFH: Fixed bug #36224 (date(DATE_ATOM) gives wrong results).
1 parent 526bc44 commit 0249f6b

File tree

3 files changed

+23
-3
lines changed

3 files changed

+23
-3
lines changed

NEWS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ PHP NEWS
2020
on error. (Pierre)
2121
- Fixed bug #36235 (ocicolumnname returns false before a succesfull fetch).
2222
(Tony)
23+
- Fixed bug #36224 (date(DATE_ATOM) gives wrong results). (Derick, Hannes
24+
Magnusson)
2325
- Fixed bug #36222 (errorInfo in PDOException is always NULL). (Ilia)
2426
- Fixed bug #36185 (str_rot13(NULL) crash). (Pierre)
2527
- Fixed bug #36176 (PDO_PGSQL - PDO::exec() does not return number of rows

ext/date/php_date.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,7 @@ PHP_RSHUTDOWN_FUNCTION(date)
235235

236236
#define DATE_TIMEZONEDB php_date_global_timezone_db ? php_date_global_timezone_db : timelib_builtin_db()
237237

238+
#define DATE_FORMAT_RFC3339 "Y-m-d\\TH:i:sP"
238239
#define DATE_FORMAT_ISO8601 "Y-m-d\\TH:i:sO"
239240
#define DATE_FORMAT_RFC1036 "l, d-M-y H:i:s T"
240241
#define DATE_FORMAT_RFC1123 "D, d M Y H:i:s T"
@@ -260,7 +261,7 @@ PHP_MINIT_FUNCTION(date)
260261
#ifdef EXPERIMENTAL_DATE_SUPPORT
261262
date_register_classes(TSRMLS_C);
262263
#endif
263-
REGISTER_STRING_CONSTANT("DATE_ATOM", DATE_FORMAT_ISO8601, CONST_CS | CONST_PERSISTENT);
264+
REGISTER_STRING_CONSTANT("DATE_ATOM", DATE_FORMAT_RFC3339, CONST_CS | CONST_PERSISTENT);
264265
REGISTER_STRING_CONSTANT("DATE_COOKIE", DATE_FORMAT_RFC1123, CONST_CS | CONST_PERSISTENT);
265266
REGISTER_STRING_CONSTANT("DATE_ISO8601", DATE_FORMAT_ISO8601, CONST_CS | CONST_PERSISTENT);
266267
REGISTER_STRING_CONSTANT("DATE_RFC822", DATE_FORMAT_RFC1123, CONST_CS | CONST_PERSISTENT);
@@ -459,6 +460,7 @@ static char *date_format(char *format, int format_len, timelib_time *t, int loca
459460
char buffer[33];
460461
timelib_time_offset *offset;
461462
timelib_sll isoweek, isoyear;
463+
int rfc_colon = 0;
462464

463465
if (!format_len) {
464466
return estrdup("");
@@ -537,9 +539,11 @@ static char *date_format(char *format, int format_len, timelib_time *t, int loca
537539

538540
/* timezone */
539541
case 'I': snprintf(buffer, 32, "%d", localtime ? offset->is_dst : 0); break;
540-
case 'O': snprintf(buffer, 32, "%c%02d%02d",
542+
case 'P': rfc_colon = 1; /* break intentionally missing */
543+
case 'O': snprintf(buffer, 32, "%c%02d%s%02d",
541544
localtime ? ((offset->offset < 0) ? '-' : '+') : '+',
542545
localtime ? abs(offset->offset / 3600) : 0,
546+
rfc_colon ? ":" : "",
543547
localtime ? abs((offset->offset % 3600) / 60) : 0
544548
);
545549
break;
@@ -1198,14 +1202,15 @@ static void date_register_classes(TSRMLS_D)
11981202
#define REGISTER_DATE_CLASS_CONST_STRING(const_name, value) \
11991203
zend_declare_class_constant_stringl(date_ce_date, const_name, sizeof(const_name)-1, value, sizeof(value)-1 TSRMLS_CC);
12001204

1201-
REGISTER_DATE_CLASS_CONST_STRING("ATOM", DATE_FORMAT_ISO8601);
1205+
REGISTER_DATE_CLASS_CONST_STRING("ATOM", DATE_FORMAT_RFC3339);
12021206
REGISTER_DATE_CLASS_CONST_STRING("COOKIE", DATE_FORMAT_RFC1123);
12031207
REGISTER_DATE_CLASS_CONST_STRING("ISO8601", DATE_FORMAT_ISO8601);
12041208
REGISTER_DATE_CLASS_CONST_STRING("RFC822", DATE_FORMAT_RFC1123);
12051209
REGISTER_DATE_CLASS_CONST_STRING("RFC850", DATE_FORMAT_RFC1036);
12061210
REGISTER_DATE_CLASS_CONST_STRING("RFC1036", DATE_FORMAT_RFC1036);
12071211
REGISTER_DATE_CLASS_CONST_STRING("RFC1123", DATE_FORMAT_RFC1123);
12081212
REGISTER_DATE_CLASS_CONST_STRING("RFC2822", DATE_FORMAT_RFC2822);
1213+
REGISTER_DATE_CLASS_CONST_STRING("RFC3339", DATE_FORMAT_RFC3339);
12091214
REGISTER_DATE_CLASS_CONST_STRING("RSS", DATE_FORMAT_RFC1123);
12101215
REGISTER_DATE_CLASS_CONST_STRING("W3C", DATE_FORMAT_ISO8601);
12111216

ext/date/tests/bug36224.phpt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
--TEST--
2+
Bug #36224 (date(DATE_ATOM) gives wrong resulsts)
3+
--FILE--
4+
<?php
5+
date_default_timezone_set("Europe/Oslo");
6+
7+
echo date(DATE_ATOM, strtotime('2006-01-31T19:23:56Z')) . "\n";
8+
echo date(DATE_ATOM, strtotime('2006-01-31T19:23:56')) . "\n";
9+
10+
?>
11+
--EXPECT--
12+
2006-01-31T20:23:56+01:00
13+
2006-01-31T19:23:56+01:00

0 commit comments

Comments
 (0)