diff --git a/src/Symfony/Component/Intl/Tests/TimezonesTest.php b/src/Symfony/Component/Intl/Tests/TimezonesTest.php index dd0c7e00f346..92df84bc1200 100644 --- a/src/Symfony/Component/Intl/Tests/TimezonesTest.php +++ b/src/Symfony/Component/Intl/Tests/TimezonesTest.php @@ -529,4 +529,18 @@ public function testExists() $this->assertTrue(Timezones::exists('Europe/Amsterdam')); $this->assertFalse(Timezones::exists('Etc/Unknown')); } + + public function testGetRawOffset() + { + $this->assertSame(0, Timezones::getRawOffset('Etc/UTC')); + $this->assertSame(-10800, Timezones::getRawOffset('America/Buenos_Aires')); + $this->assertSame(20700, Timezones::getRawOffset('Asia/Katmandu')); + } + + public function testGetGmtOffset() + { + $this->assertSame('GMT+00:00', Timezones::getGmtOffset('Etc/UTC')); + $this->assertSame('GMT-03:00', Timezones::getGmtOffset('America/Buenos_Aires')); + $this->assertSame('GMT+05:45', Timezones::getGmtOffset('Asia/Katmandu')); + } } diff --git a/src/Symfony/Component/Intl/Timezones.php b/src/Symfony/Component/Intl/Timezones.php index 89577ca7f85c..291265567115 100644 --- a/src/Symfony/Component/Intl/Timezones.php +++ b/src/Symfony/Component/Intl/Timezones.php @@ -12,6 +12,7 @@ namespace Symfony\Component\Intl; use Symfony\Component\Intl\Exception\MissingResourceException; +use Symfony\Component\Intl\Exception\RuntimeException; /** * Gives access to timezone-related ICU data. @@ -52,6 +53,29 @@ public static function getNames(string $displayLocale = null): array return self::asort(self::readEntry(['Names'], $displayLocale), $displayLocale); } + public static function getRawOffset(string $timezone, int $timestamp = null): int + { + if (null === $timestamp) { + $timestamp = time(); + } + + $transitions = (new \DateTimeZone($timezone))->getTransitions($timestamp, $timestamp); + + if (!isset($transitions[0]['offset'])) { + throw new RuntimeException('No timezone transitions available.'); + } + + return $transitions[0]['offset']; + } + + public static function getGmtOffset(string $timezone, int $timestamp = null): string + { + $offset = self::getRawOffset($timezone, $timestamp); + $abs = abs($offset); + + return sprintf('GMT%s%02d:%02d', 0 <= $offset ? '+' : '-', $abs / 3600, $abs / 60 % 60); + } + protected static function getPath(): string { return Intl::getDataDirectory().'/'.Intl::TIMEZONE_DIR;