]> granicus.if.org Git - php/commitdiff
datetime: new format "p", same as "P" but returning "Z" for UTC
authorGregor Harlan <mail@gh01.de>
Sun, 26 Jul 2020 18:29:40 +0000 (20:29 +0200)
committerChristoph M. Becker <cmbecker69@gmx.de>
Mon, 3 Aug 2020 08:44:48 +0000 (10:44 +0200)
NEWS
UPGRADING
ext/date/php_date.c
ext/date/tests/date_format_timezone.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index d1ce1ff4a35a2585d8015b936c69ba10dc0d6257..f9f035c52fd936ae56888e0c4b797636882e41cb 100644 (file)
--- 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)
index d4ddcede72fa23c90bd073f8aa16c902d1f23dcc..8f749b2acdd7ea5097475f8929931d1a301c76c5 100644 (file)
--- 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
index 9839d768f9b422c4266126304c55581a153ca28a..8f755d887f18e1c59162023a384f2ea84579a9ba 100644 (file)
@@ -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 (file)
index 0000000..ea4575e
--- /dev/null
@@ -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"