1

奇妙さ。エッジケースではありません。むしろ、私のサーバーがアメリカ/トロントの日付/時刻を保存しているとしましょう。次に、たとえば西海岸にいる場合に備えて、時間変換ロジックを実行します。これが私が得たコードです:

$timestamp = '2012-07-25 16:30:00';
$to = 'America/Toronto';
$from = 'America/Toronto';

// system timezone
$system = (new DateTimeZone($from));

// desired conversion timezone
$desired = (new DateTimeZone($to));

// timestamp DateTime object
$resource = (new DateTime($timestamp, $system));

// offset
$offset = $desired->getOffset($resource);
print($offset);

この時点で印刷されるオフセットは -14440 (4 時間) です。システムまたはデータベースのタイムゾーンがここに来るとは思いません (両方ともアメリカ/トロントに設定されています)。これについては、どんな光でもいただければ幸いです。紛らわしい:(

4

2 に答える 2

3

DateTimeZone::getOffset()GMT からのオフセットを秒単位で返します (-14440 = アメリカ/トロントの場合は 4 時間)。

編集:

との最初の混乱をお詫びしDateTime::getOffset()ます。

とにかく、質問のタイトルに対処するにはDateTime::setTimeZone()、タイムゾーン間の変換に使用します。

于 2012-07-24T04:27:13.480 に答える
1

これはおそらくあなたが探しているもので、2 つのタイムゾーン間のオフセットです。

// system timezone
$system = (new DateTimeZone($from));

// desired conversion timezone
$desired = (new DateTimeZone($to));

// timestamp DateTime object
$resource = (new DateTime($timestamp, $system));
$desiredDateTime = (new DateTime($timestamp, $desired));

// offset
$offset = $desired->getOffset($desiredDateTime) - $system->getOffset($resource);
print($offset);
于 2012-07-24T04:31:56.390 に答える