Сегодня я заметил, что мой script для конвертирования и отображения идентификаторов часовых поясов Olson в Cities и GMT смещения дает некоторые очень странные результаты: зоны в Аргентине привлекли мое внимание, потому что они отображали стандартное (не DST) временное смещение ± 0000 в отношении GMT/UTC.
Я просмотрел свой код, и я нашел небольшую ошибку в моей логике, однако это не было связано с расхождением, поэтому я обновил timezonedb
через pecl
до версии 2012.8
, но все равно возвратил неправильное смещение...
Вот код, который возвращает последние 3 изменения в часовой пояс America/Argentina/San_Luis
:
$timezone = new DateTimeZone('America/Argentina/San_Luis');
$transitions = $timezone->getTransitions();
echo '<pre>';
print_r(array_slice($transitions, -3, null, true));
echo '</pre>';
И это результат:
Array
(
[59] => Array
(
[ts] => 1223784000
[time] => 2008-10-12T04:00:00+0000
[offset] => -10800
[isdst] => 1
[abbr] => WARST
)
[60] => Array
(
[ts] => 1236481200
[time] => 2009-03-08T03:00:00+0000
[offset] => -14400
[isdst] =>
[abbr] => WART
)
[61] => Array
(
[ts] => 1255233600
[time] => 2009-10-11T04:00:00+0000
[offset] => -10800
[isdst] => 1
[abbr] => WARST
)
)
Как вы можете видеть, индексы 59
и 61
являются смещениями DST, тогда как индекс 60
является стандартным смещением по времени.
Однако, если вы проверите Time & Date, стандартное смещение должно быть -10800
(3 часа), а не -14400
:
Standard time zone: UTC/GMT -3 hours
No daylight saving time in 2012
Time zone abbreviation: ART - Argentina Time
На самом деле даже abbr
неверно (должно быть ART
, так как на 2009-10-10 DST был прекращен).
Что здесь происходит? Я уверен, что это не имеет значения, но я выполняю PHP 5.4.6, если это имеет значение.
PS: Я помню, что читал о некоторых юридических проблемах с базой данных Olson, может быть это связано?
UPDATE. Я написал немного script для сравнения смещений PHP без DST с этой страницей в Википедии
function getStandardOffset($timezone)
{
$timezone = new DateTimeZone($timezone);
//$hemisphere = (ph()->Value($timezone->getLocation(), 'latitude') >= 0) ? 'north' : 'south';
$transitions = array_reverse(array_slice($timezone->getTransitions(), -3, null, true), true);
foreach ($transitions as $transition)
{
if ($transition['isdst'] == 1)
{
continue;
}
return sprintf('%+03d:%02u', $transition['offset'] / 3600, abs($transition['offset']) % 3600 / 60);
}
return false;
}
$diff = array();
$html = ph()->HTML->DOM(file_get_contents('http://en.wikipedia.org/wiki/List_of_tz_database_time_zones'));
$timezones = DateTimeZone::listIdentifiers();
foreach ($timezones as $timezone)
{
$offset = str_replace('−', '-', ph()->HTML->DOM($html, sprintf('//td/a[contains(text(), "%s")]/../..', $timezone), '0.td.4.a'));
if (strcmp($offset, getStandardOffset($timezone)) !== 0)
{
$diff[$timezone] = array
(
'php' => getStandardOffset($timezone),
'wiki' => $offset,
);
}
}
echo '<pre>';
print_r($diff);
echo '</pre>';
Следующие часовые пояса отличаются:
Array
(
[America/Argentina/San_Luis] => Array
(
[php] => -04:00
[wiki] => -03:00
)
[Antarctica/Casey] => Array
(
[php] => +08:00
[wiki] => +11:00
)
[Antarctica/Davis] => Array
(
[php] => +07:00
[wiki] => +05:00
)
)
Это не огромная сделка, но мне любопытно, почему это происходит, поскольку у меня есть последняя версия Олсона tzdb.