12

今日、オルソンのタイムゾーン ID を都市と GMT オフセットに変換して表示するスクリプトが、非常に奇妙な結果を生成していることに気付きました。 /UTC。

コードを調べたところ、ロジックに小さなバグが見つかりましたが、不一致とは関係がないため、timezonedb経由peclでバージョンに更新しまし2012.8たが、まだ間違ったオフセットを返しています...

America/Argentina/San_Luisタイムゾーンに最後の 3 つの変更を返すコードを次に示します。

$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
        )
)

ご覧のとおり、インデックス5961は 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

実際、 でさえ間違っています (2009 年 10 月10日にDST が廃止されてからのabbrはずです)。ART

ここで何がうまくいかないのですか?これは無関係だと確信していますが、問題がある場合は PHP 5.4.6 を実行しています。

PS : Olson データベースに関するいくつかの法的な問題について読んだことを覚えていますが、これは関連している可能性がありますか?


更新: 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
        )
)

大したことではありませんが、最新バージョンの Olson tzdb を持っているので、なぜこれが起こるのか知りたいです。

4

1 に答える 1

1

ここで最初の例を取り上げます。

[60] => Array
    (
        [ts] => 1236481200
        [time] => 2009-03-08T03:00:00+0000
        [offset] => -14400
        [isdst] => 
        [abbr] => WART
    )

ただし、Time&Date をチェックすると、標準オフセットは -14400 ではなく -10800 (3 時間) になります。

私が読んだ限りでは、これは真実ではありません。この記事によると、その頃 (2009 年 3 月 3 日) に、タイムゾーンは、夏時間がない場合は UTC-4 に、ある場合は UTC-3 に変更されました。ただし、この記事で言及されている日付は 3 月 14/15 日であり、3 月 8 日ではありません...何がその違いを引き起こしたのかはわかりません。

于 2013-02-15T02:56:01.783 に答える