459

特定のタイムゾーンの日時を文字列として持っており、これを現地時間に変換したいと思います。しかし、Dateオブジェクトでタイムゾーンを設定する方法がわかりません。

たとえば、私はFeb 28 2013 7:00 PM ET,それから私はすることができます

var mydate = new Date();
mydate.setFullYear(2013);
mydate.setMonth(02);
mydate.setDate(28);
mydate.setHours(7);
mydate.setMinutes(00);  

私の知る限り、UTC時間または現地時間を設定できます。しかし、別のタイムゾーンで時間を設定するにはどうすればよいですか?

UTCからのオフセットの加算/減算を使用しようとしましたが、夏時間に対抗する方法がわかりません。私が正しい方向に向かっているかどうかはわかりません。

JavaScriptで時間を別のタイムゾーンから現地時間に変換するにはどうすればよいですか?

4

17 に答える 17

633

バックグラウンド

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 言語自体で日付と時刻を操作するための標準オブジェクトの新しいセットを提供することを目的としています。これには、タイム ゾーン対応オブジェクトのサポートが含まれます。

于 2013-03-02T05:17:45.367 に答える
44

でタイム ゾーン オフセットを指定できますnew Date()。次に例を示します。

new Date('Feb 28 2013 19:00:00 EST')

また

new Date('Feb 28 2013 19:00:00 GMT-0500')

DateUTC 時刻を保存する (つまりgetTimeUTC で返す) ため、javascript は時刻を UTC に変換し、javascript のようなものを呼び出すと、toStringUTC 時刻をブラウザのローカル タイムゾーンに変換し、文字列をローカル タイムゾーンで返します。UTC+8:

> new Date('Feb 28 2013 19:00:00 GMT-0500').toString()
< "Fri Mar 01 2013 08:00:00 GMT+0800 (CST)"

getHours/Minute/Secondまた、通常の方法を使用することもできます:

> new Date('Feb 28 2013 19:00:00 GMT-0500').getHours()
< 8

(これ8は、時間を現地時間に変換した後、UTC+8時間数が であることを意味し8ます。)

于 2016-02-04T09:33:00.020 に答える
0

3年遅すぎることはわかっていますが、彼がここで求めているものとまったく同じではない瞬間タイムゾーンライブラリを除いて、そのようなものを見つけられなかったため、他の誰かを助けることができるかもしれません.

ドイツのタイムゾーンについても同様のことを行いましたが、夏時間とうるう年が 366 日あるため、これは少し複雑です。

「isDaylightSavingTimeInGermany」関数を少し操作する必要があるかもしれませんが、異なるタイムゾーンは夏時間の異なる時間に変化します。

とにかく、このページをチェックしてください: https://github.com/zerkotin/german-timezone-converter/wiki

主なメソッドは次のとおりです。 convertLocalDateToGermanTimezone convertGermanDateToLocalTimezone

私はそれを文書化することに力を入れたので、それほど混乱することはありません.

于 2016-04-14T13:18:49.560 に答える