今天,我注意到我的脚本将Olson时区ID转换为城市,GMT Offsets产生了一些非常奇怪的结果:阿根廷区引起了我的注意,因为它们正在显示标准(非 - DST)参考GMT/UTC的时间偏移±0000。
我检查了我的代码,我发现了一个小错误,但是它与差异无关,因此我通过pecl
更新了timezonedb
版本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
是标准时间偏移。
但是,如果您检查时间&amp;日期,标准偏移应为-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中停产)。
这里出了什么问题?我很确定这是无关紧要的,但是如果重要的话,我正在运行5.4.6 php。
PS :我记得在Olson数据库中读到有关某些法律问题的读物,这可能是相关的吗?
更新:我写了一个小脚本来将php non-dst Offsets与此Wikipedia页面进行比较:
: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
)
)
这没什么大不了的,但是我很好奇为什么会发生这种情况,因为我拥有Olson TZDB的最新版本。
我将在此处以您的第一个示例:
[60] => Array
(
[ts] => 1236481200
[time] => 2009-03-08T03:00:00+0000
[offset] => -14400
[isdst] =>
[abbr] => WART
)
但是,如果您检查时间&amp;日期,标准偏移量应为-10800(3小时),而不是-14400
根据我阅读的内容,这是不正确的;根据本文,大约在那段时间(2009年3月3日),如果有的话,当没有日光保存和UTC-3时,时区已将其更改为UTC-4。但是,文章中提到的日期是3月14日,而不是3月8日...我不确定是什么造成了差异。