summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGregor Harlan <mail@gh01.de>2020-07-26 20:29:40 +0200
committerChristoph M. Becker <cmbecker69@gmx.de>2020-08-03 10:44:48 +0200
commita6e3ce4fd656132e5482e2bc7fc0f7cdf4633077 (patch)
tree2ab4d18d4f83c27ea49909b7b883a412f4940b7b
parentbb8b95be636528ebfc6f00b2153254d06e27ead9 (diff)
downloadphp-git-a6e3ce4fd656132e5482e2bc7fc0f7cdf4633077.tar.gz
datetime: new format "p", same as "P" but returning "Z" for UTC
-rw-r--r--NEWS2
-rw-r--r--UPGRADING2
-rw-r--r--ext/date/php_date.c6
-rw-r--r--ext/date/tests/date_format_timezone.phpt43
4 files changed, 53 insertions, 0 deletions
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--
+<?php
+
+$tz = array("UTC", "Europe/London", "Europe/Berlin", "America/Chicago");
+
+foreach ($tz as $zone) {
+ echo $zone, "\n";
+ date_default_timezone_set($zone);
+
+ $date = date_create("2020-03-10 22:30:41");
+
+ var_dump( date_format($date, "O") );
+ var_dump( date_format($date, "P") );
+ var_dump( date_format($date, "p") );
+}
+
+echo "Z\n";
+$date = date_create("2020-03-10 22:30:41Z");
+
+var_dump( date_format($date, "p") );
+
+?>
+--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"