From a609d55c1f834b34d6ca665c91facabd4b3ddc08 Mon Sep 17 00:00:00 2001 From: Eriksen Costa Date: Mon, 18 Jun 2012 01:41:22 -0300 Subject: [PATCH] [Locale] fixed StubIntlDateFormatter to behave like the ext/intl implementation --- .../Locale/Stub/StubIntlDateFormatter.php | 7 ++- .../Locale/Stub/StubIntlDateFormatterTest.php | 55 ++++++++++++++++++- 2 files changed, 59 insertions(+), 3 deletions(-) diff --git a/src/Symfony/Component/Locale/Stub/StubIntlDateFormatter.php b/src/Symfony/Component/Locale/Stub/StubIntlDateFormatter.php index d236fb7845..d16bd667ff 100644 --- a/src/Symfony/Component/Locale/Stub/StubIntlDateFormatter.php +++ b/src/Symfony/Component/Locale/Stub/StubIntlDateFormatter.php @@ -458,7 +458,12 @@ class StubIntlDateFormatter public function setTimeZoneId($timeZoneId) { if (null === $timeZoneId) { - $timeZoneId = date_default_timezone_get(); + // TODO: changes were made to ext/intl in PHP 5.4.4 release that need to be investigated since it will + // use ini's date.timezone when the time zone is not provided. As a not well tested workaround, uses UTC. + // See the first two items of the commit message for more information: + // https://github.com/php/php-src/commit/eb346ef0f419b90739aadfb6cc7b7436c5b521d9 + $timeZoneId = getenv('TZ') ?: 'UTC'; + $this->unitializedTimeZoneId = true; } diff --git a/tests/Symfony/Tests/Component/Locale/Stub/StubIntlDateFormatterTest.php b/tests/Symfony/Tests/Component/Locale/Stub/StubIntlDateFormatterTest.php index e289e92399..b3db625221 100644 --- a/tests/Symfony/Tests/Component/Locale/Stub/StubIntlDateFormatterTest.php +++ b/tests/Symfony/Tests/Component/Locale/Stub/StubIntlDateFormatterTest.php @@ -463,6 +463,7 @@ class StubIntlDateFormatterTest extends LocaleTestCase { $this->skipIfIntlExtensionIsNotLoaded(); $this->skipIfICUVersionIsTooOld(); + $formatter = new \IntlDateFormatter('en', StubIntlDateFormatter::MEDIUM, StubIntlDateFormatter::SHORT); $formatter->setPattern('yyyy-MM-dd HH:mm:ss'); @@ -472,6 +473,54 @@ class StubIntlDateFormatterTest extends LocaleTestCase ); } + public function testFormatWithDefaultTimezoneStubShouldUseTheTzEnvironmentVariableWhenAvailable() + { + $tz = getenv('TZ'); + putenv('TZ=Europe/London'); + + $formatter = new StubIntlDateFormatter('en', StubIntlDateFormatter::MEDIUM, StubIntlDateFormatter::SHORT); + $formatter->setPattern('yyyy-MM-dd HH:mm:ss'); + + $this->assertEquals( + $this->createDateTime(0)->format('Y-m-d H:i:s'), + $formatter->format(0) + ); + + $this->assertEquals('Europe/London', getenv('TZ')); + + // Restores TZ. + putenv('TZ='.$tz); + } + + /** + * It seems IntlDateFormatter caches the timezone id when not explicitely set via constructor or by the + * setTimeZoneId() method. Since testFormatWithDefaultTimezoneIntl() runs using the default environment + * time zone, this test would use it too if not running in a separated process. + * + * @runInSeparateProcess + */ + public function testFormatWithDefaultTimezoneIntlShouldUseTheTzEnvironmentVariableWhenAvailable() + { + $this->skipIfIntlExtensionIsNotLoaded(); + $this->skipIfICUVersionIsTooOld(); + + $tz = getenv('TZ'); + putenv('TZ=Europe/Paris'); + + $formatter = new \IntlDateFormatter('en', StubIntlDateFormatter::MEDIUM, StubIntlDateFormatter::SHORT); + $formatter->setPattern('yyyy-MM-dd HH:mm:ss'); + + $this->assertEquals('Europe/Paris', getenv('TZ')); + + $this->assertEquals( + $this->createDateTime(0)->format('Y-m-d H:i:s'), + $formatter->format(0) + ); + + // Restores TZ. + putenv('TZ='.$tz); + } + /** * @expectedException Symfony\Component\Locale\Exception\NotImplementedException */ @@ -994,11 +1043,13 @@ class StubIntlDateFormatterTest extends LocaleTestCase return new \IntlDateFormatter('en', \IntlDateFormatter::MEDIUM, \IntlDateFormatter::SHORT, 'UTC', \IntlDateFormatter::GREGORIAN, $pattern); } - protected function createDateTime($timestamp = null, $timeZone = null) + protected function createDateTime($timestamp = null) { + $timeZone = getenv('TZ') ?: 'UTC'; + $dateTime = new \DateTime(); $dateTime->setTimestamp(null === $timestamp ? time() : $timestamp); - $dateTime->setTimeZone(new \DateTimeZone(null === $timeZone ? date_default_timezone_get() : $timeZone)); + $dateTime->setTimeZone(new \DateTimeZone($timeZone)); return $dateTime; }