From: Gregor Harlan Date: Sun, 26 Jul 2020 18:29:40 +0000 (+0200) Subject: datetime: new format "p", same as "P" but returning "Z" for UTC X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a6e3ce4fd656132e5482e2bc7fc0f7cdf4633077;p=php datetime: new format "p", same as "P" but returning "Z" for UTC --- diff --git a/NEWS b/NEWS index d1ce1ff4a3..f9f035c52f 100644 --- a/NEWS +++ b/NEWS @@ -13,6 +13,8 @@ PHP NEWS - Date: . Fixed bug #60302 (DateTime::createFromFormat should new static(), not new self()). (Derick) + . Implemented FR #79903 (datetime: new format "p", same as "P" but returning + "Z" for UTC). (gharlan) - JIT: . Fixed bug #79864 (JIT segfault in Symfony OptionsResolver). (Dmitry) diff --git a/UPGRADING b/UPGRADING index d4ddcede72..8f749b2acd 100644 --- a/UPGRADING +++ b/UPGRADING @@ -683,6 +683,8 @@ PHP 8.0 UPGRADE NOTES - Date: . Added DateTime::createFromInterface() and DateTimeImmutable::createFromInterface(). + . Added the DateTime format specifier "p" which is the same as "P" but + returning "Z" for UTC. - Dom: . Introduce DOMParentNode and DOMChildNode with new traversal and diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 9839d768f9..8f755d887f 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -711,6 +711,12 @@ static zend_string *date_format(const char *format, size_t format_len, timelib_t /* timezone */ case 'I': length = slprintf(buffer, sizeof(buffer), "%d", localtime ? offset->is_dst : 0); break; + case 'p': + if (!localtime || strcmp(offset->abbr, "UTC") == 0 || strcmp(offset->abbr, "Z") == 0) { + length = slprintf(buffer, sizeof(buffer), "%s", "Z"); + break; + } + /* break intentionally missing */ case 'P': rfc_colon = 1; /* break intentionally missing */ case 'O': length = slprintf(buffer, sizeof(buffer), "%c%02d%s%02d", localtime ? ((offset->offset < 0) ? '-' : '+') : '+', diff --git a/ext/date/tests/date_format_timezone.phpt b/ext/date/tests/date_format_timezone.phpt new file mode 100644 index 0000000000..ea4575e4ce --- /dev/null +++ b/ext/date/tests/date_format_timezone.phpt @@ -0,0 +1,43 @@ +--TEST-- +Test date_format() function : timezone offset +--FILE-- + +--EXPECT-- +UTC +string(5) "+0000" +string(6) "+00:00" +string(1) "Z" +Europe/London +string(5) "+0000" +string(6) "+00:00" +string(6) "+00:00" +Europe/Berlin +string(5) "+0100" +string(6) "+01:00" +string(6) "+01:00" +America/Chicago +string(5) "-0500" +string(6) "-05:00" +string(6) "-05:00" +Z +string(1) "Z"