2011-01-23 11 views
0

私は2つのタイムゾーン間のオフセットを計算していますが、私は次のコードで、私は期待していない結果(ゼロ)を見ている:私はタイムゾーン文字列を反転した場合PHP:なぜこのコードが誤ってゼロを返すのですか?

$datetimezone_london = new DateTimeZone('Europe/London'); 
$datetimezone_client = new DateTimeZone('Australia/Canberra'); 
$now_client = new DateTime("now", $datetimezone_client); 
$offset = $datetimezone_london->getOffset($now_client); 
echo $offset; 

、それは動作しますが、確かに上記のコードもうまくいくはずです。何が起こっていますか?

答えて

1

DateTimeZone::getOffset()は、ほとんどの人が考えるように少し違って動作します。これは、パラメータとして渡された日付のオフセットであるDateTimeZoneオフセットのGMTへのオフセットを計算します。パラメータとして渡された日付は、インスタンスと同じタイムゾーンに変換され(DSTおよびその他のルールが適用されます)、その日付のオフセットが計算されます。 Europe/Londonは、あなたが0になっている(BMT対)今GMTにあるので

だからあなたのコードが今..タイムゾーンEurope/LondonのGMTへのオフセットを算出する(8月の日付を試してみてください、あなたは36000を取得します) 。

使用すると、2つのタイムゾーン間の電流差をつけたい場合は、このコードを使用して...

function timezone_diff($origin, $compareTo, $forDate = "now") { 
    $dtzOrigin = new DateTimeZone($origin); 
    $dtzCompareTo = new DateTimeZone($compareTo); 

    $compareDate = new DateTime($forDate); 

    $offsetOrigin = $dtzOrigin->getOffset($compareDate); 
    $offsetCompareTo = $dtzCompareTo->getOffset($compareDate); 

    return $offsetCompareTo - $offsetOrigin; 
} 
+0

ありがとうございました! PHPのドキュメンテーションは本当に欠けていて、私は決してこれを知らないでしょう。 – Matty

2

getOffset()returns the offset to GMT秒であり、ロンドンは現在GMT上にあるため、戻り値はゼロです。

私はあなたの代わりに、必要なものをされて信じている:

$tz_london = new DateTimeZone('Europe/London'); 
$tz_client = new DateTimeZone('Australia/Canberra'); 
$time_london = new DateTime('now', $tz_london); 
$time_client = new DateTime('now', $tz_client); 
$offset = $time_client->getOffset() - $time_london->getOffset(); 
echo $offset; 

現在(1月中)これは39600(11時間)を返します。 7月には9時間を返し、10月中旬(ヨーロッパとオーストラリアの両方が夏時間になっている短期間)に10時間を返します。

+0

私は、ドキュメントを読み違えると、そのページのコード例とは異なる振る舞いを期待したいです。ありがとう – Matty

+1

-1:実際には間違っています... DateTimeZone :: getOffsetは、渡されたDTオブジェクトで定義されたDSTルールを使用して、GMTとDTZオブジェクトの間の差を計算します。 –

+1

私は(すでに)DTZの代わりにDateTimeを使用するようにコードを変更しました – Alnitak

関連する問題