Skip to content

Commit

Permalink
[Intl] Add timezone offset utilities
Browse files Browse the repository at this point in the history
  • Loading branch information
ro0NL committed Apr 28, 2019
1 parent 73d303a commit b166e33
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 0 deletions.
14 changes: 14 additions & 0 deletions src/Symfony/Component/Intl/Tests/TimezonesTest.php
Expand Up @@ -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'));
}
}
24 changes: 24 additions & 0 deletions src/Symfony/Component/Intl/Timezones.php
Expand Up @@ -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.
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit b166e33

Please sign in to comment.