Date.prototype.getTimezoneOffset()

getTimezoneOffset() メソッドは、(ホストシステム上における)現在のロケールから協定世界時 (UTC) までのタイムゾーンの差を分単位で返します。

試してみましょう

構文

js
getTimezoneOffset()

返値

UTC タイムゾーンで評価された日時とローカルタイムゾーンで評価された日時の差を分単位で表したもの。実際のローカルタイムアルゴリズムは実装で定義され、適切なデータがないランタイムでは返値が 0 になることが許容されます。

解説

date.getTimezoneOffset() は、 date が UTC タイムゾーンで評価されたものとローカルタイムゾーンで評価されたものの差を分単位で返します。つまり、(コードがブラウザーでウェブから実行された場合)ブラウザーを使用しているホストシステムのタイムゾーン、あるいは、コードが実行された JavaScript ランタイム(例えば Node.js 環境) のホストシステムのタイムゾーンです。

負の値と正の値

getTimezoneOffset() が返す分の値は、ローカルのタイムゾーンが UTC よりも後の場合は正の値、先の場合は負の値になります。例えば、UTC+10 の場合、-600 を返します。

現在のタイムゾーン 返値
UTC-8 480
UTC 0
UTC+3 -180

夏時間適用地域で変化する結果

毎年夏時間に移行する地域では、 date が変化すると、 getTimezoneOffset() を呼び出して返される分の値が一定でなくなる可能性があります。

メモ: getTimezoneOffset() の動作は、コードが実行された時間によって変わることはありません。同じ地域で実行した場合の動作は、常に一定です。結果に影響を与えるのは date の値のみです。

ほとんどの実装では、 IANA time zone database (tzdata) を使用して date の瞬間のローカルタイムゾーンのオフセットを正確に決定しています。しかし、そのような情報が得られない場合、実装は 0 を返すかもしれません。

getTimezoneOffset() の使用

js
// 現在の時刻を表す Date インスタンスを作成する
const currentLocalDate = new Date();
// 2016 年 5 月 1 日 03:24 GMT-0200 の Date インスタンスを作成する
const laborDay2016at0324GMTminus2 = new Date("2016-05-01T03:24:00-02:00");
currentLocalDate.getTimezoneOffset() ===
  laborDay2016at0324GMTminus2.getTimezoneOffset();
// 夏時間に毎年移行しないタイムゾーンでは常に true となります。
// 毎年夏時間に移行するあらゆるタイムゾーンは、 false になることがあります。

getTimezoneOffset() と夏時間

夏時間が使用されている地域では、 date がある時期によって返値が変わることがあります。下記は、タイムゾーンが UTC-05:00 であるニューヨークでの実行時の出力結果です。

js
const nyOffsetSummer = new Date("2022-02-01").getTimezoneOffset(); // 300
const nyOffsetWinter = new Date("2022-08-01").getTimezoneOffset(); // 240

getTimezoneOffset() と歴史的なデータ

歴史的な理由により、ある地域が属するタイムゾーンが、夏時間によらなくても変化していることがあります。例えば、下記はタイムゾーンが UTC+08:00 である上海での実行時の出力です。

js
const shModernOffset = new Date("2022-01-27").getTimezoneOffset(); // -480
const shHistoricalOffset = new Date("1943-01-27").getTimezoneOffset(); // -540

これは、日中戦争中で上海が日本の統制下にあった時、日本に合わせてタイムゾーンを UTC+09:00 に変更しており(実質的には「通年夏時間」)、そのことが IANA データベースに記録されていたためです。

仕様書

Specification
ECMAScript Language Specification
# sec-date.prototype.gettimezoneoffset

ブラウザーの互換性

BCD tables only load in the browser

関連情報