バックグラウンド
JavaScript のDate
オブジェクトは、内部的に UTC で時間を追跡しますが、通常は入力を受け入れ、実行中のコンピューターの現地時間で出力を生成します。他のタイム ゾーンの時刻を操作するための機能はほとんどありません。
オブジェクトの内部表現は、うるう秒に関係なく、Date
から経過したミリ秒数を表す単一の数値です。1970-01-01 00:00:00 UTC
Date オブジェクト自体に保存されるタイム ゾーンや文字列形式はありません。
オブジェクトのさまざまな機能Date
が使用されると、コンピュータのローカル タイム ゾーンが内部表現に適用されます。関数が文字列を生成する場合、コンピュータのロケール情報を考慮して、その文字列を生成する方法を決定できます。詳細は関数ごとに異なり、一部は実装固有です。
Date
オブジェクトが非ローカル タイム ゾーンで実行できる唯一の操作は次のとおりです。
任意のタイム ゾーンからの数値 UTC オフセットを含む文字列を解析できます。これを使用して、解析される値を調整し、UTC に相当する値を格納します。元のローカル時間とオフセットは、結果のDate
オブジェクトには保持されません。例えば:
var d = new Date("2020-04-13T00:00:00.000+08:00");
d.toISOString() //=> "2020-04-12T16:00:00.000Z"
d.valueOf() //=> 1586707200000 (this is what is actually stored in the object)
ECMASCript 国際化 API (別名 "Intl")を実装した環境では、Date
オブジェクトは、特定のタイム ゾーン識別子に調整されたロケール固有の文字列を生成できます。これは、timeZone
オプション totoLocaleString
とそのバリエーションによって実現されます。ほとんどの実装は、 などの IANA タイム ゾーン識別子をサポートし'America/New_York'
ます。例えば:
var d = new Date("2020-04-13T00:00:00.000+08:00");
d.toLocaleString('en-US', { timeZone: 'America/New_York' })
//=> "4/12/2020, 12:00:00 PM"
// (midnight in China on Apring 13th is noon in New York on April 12th)
最新の環境のほとんどは、IANA タイム ゾーン識別子の完全なセットをサポートしています (こちらの互換性テーブルを参照してください)。ただし、 Intl でサポートする必要がある唯一の識別子は'UTC'
であることに注意してください。そのため、古いブラウザーや非典型的な環境 (軽量 IoT デバイスなど) をサポートする必要がある場合は、慎重に確認する必要があります。
ライブラリ
タイム ゾーンの操作に使用できるライブラリがいくつかあります。オブジェクトの動作を変更することはまだできませんが、Date
通常は標準の IANA タイムゾーン データベースを実装し、それを JavaScript で使用するための機能を提供します。最新のライブラリは Intl API によって提供されるタイム ゾーン データを使用しますが、データベースが少し大きくなる可能性があるため、特に Web ブラウザで実行している場合、古いライブラリには通常オーバーヘッドがあります。これらのライブラリの一部では、サポートされているタイム ゾーンによって、および/または操作できる日付の範囲によって、データ セットを選択的に削減することもできます。
考慮すべきライブラリは次のとおりです。
国際ベースのライブラリ
新しい開発では、タイム ゾーン データを Intl API に依存するこれらの実装のいずれかを選択する必要があります。
非国際ライブラリ
これらのライブラリは維持されますが、非常に大きくなる可能性がある独自のタイム ゾーン データをパッケージ化する負担が伴います。
* 以前は Moment と Moment-Timezone が推奨されていましたが、Moment チームは現在、ユーザーが新しい開発に Luxon を選択することを好みます。
廃止されたライブラリ
これらのライブラリは公式に廃止されており、今後は使用しないでください。
今後の提案
TC39 Temporal Proposalは、JavaScript 言語自体で日付と時刻を操作するための標準オブジェクトの新しいセットを提供することを目的としています。これには、タイム ゾーン対応オブジェクトのサポートが含まれます。