[Intl] Add timezone offset utilities

This commit is contained in:
Roland Franssen 2019-04-27 21:55:38 +02:00
parent 73d303a1fe
commit b166e33e29
2 changed files with 38 additions and 0 deletions

View File

@ -529,4 +529,18 @@ class TimezonesTest extends ResourceBundleTestCase
$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'));
}
}

View File

@ -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 @@ final class Timezones extends ResourceBundle
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;