Browse Source

fixes offset style timezone for datefmt_create

IWASE 11 years ago
parent
commit
ed3c91ce89
2 changed files with 30 additions and 1 deletions
  1. 7 1
      src/I18n/Time.php
  2. 23 0
      tests/TestCase/I18n/TimeTest.php

+ 7 - 1
src/I18n/Time.php

@@ -17,6 +17,7 @@ namespace Cake\I18n;
 use Carbon\Carbon;
 use IntlDateFormatter;
 use JsonSerializable;
+use RuntimeException;
 
 /**
  * Extends the built-in DateTime class to provide handy methods and locale-aware
@@ -578,11 +579,16 @@ class Time extends Carbon implements JsonSerializable
         $key = "{$locale}.{$dateFormat}.{$timeFormat}.{$timezone}.{$calendar}.{$pattern}";
 
         if (!isset(static::$_formatters[$key])) {
+            if ($timezone === '+00:00') {
+                $timezone = 'UTC';
+            } elseif ($timezone[0] === '+' || $timezone[0] === '-') {
+                $timezone = 'GMT' . $timezone;
+            }
             static::$_formatters[$key] = datefmt_create(
                 $locale,
                 $dateFormat,
                 $timeFormat,
-                $timezone === '+00:00' ? 'UTC' : $timezone,
+                $timezone,
                 $calendar,
                 $pattern
             );

+ 23 - 0
tests/TestCase/I18n/TimeTest.php

@@ -530,6 +530,29 @@ class TimeTest extends TestCase
     }
 
     /**
+     * test formatting dates with offset style timezone
+     *
+     * @return void
+     */
+    public function testI18nFormatWithOffsetTimezone()
+    {
+        $time = new Time('2014-01-01T00:00:00+00');
+        $result = $time->i18nFormat(\IntlDateFormatter::FULL);
+        $expected = 'Wednesday January 1 2014 12:00:00 AM GMT';
+        $this->assertTimeFormat($expected, $result);
+
+        $time = new Time('2014-01-01T00:00:00+09');
+        $result = $time->i18nFormat(\IntlDateFormatter::FULL);
+        $expected = 'Wednesday January 1 2014 12:00:00 AM GMT+09:00';
+        $this->assertTimeFormat($expected, $result);
+
+        $time = new Time('2014-01-01T00:00:00-01:30');
+        $result = $time->i18nFormat(\IntlDateFormatter::FULL);
+        $expected = 'Wednesday January 1 2014 12:00:00 AM GMT-01:30';
+        $this->assertTimeFormat($expected, $result);
+    }
+
+    /**
      * testListTimezones
      *
      * @return void