Skip to content

Commit

Permalink
feature #31295 [Intl] Add timezone offset utilities (ro0NL)
Browse files Browse the repository at this point in the history
This PR was merged into the 4.3-dev branch.

Discussion
----------

[Intl] Add timezone offset utilities

| Q             | A
| ------------- | ---
| Branch?       | master
| Bug fix?      | no
| New feature?  | yes
| BC breaks?    | no     <!-- see https://symfony.com/bc -->
| Deprecations? | no
| Tests pass?   | yes (including intl-data group)
| Fixed tickets | #...   <!-- #-prefixed issue number(s), if any -->
| License       | MIT
| Doc PR        | symfony/symfony-docs#... <!-- required for new features -->

Commits
-------

b166e33 [Intl] Add timezone offset utilities
  • Loading branch information
fabpot committed Apr 29, 2019
2 parents 002b48d + b166e33 commit ac4b322
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 ac4b322

Please sign in to comment.