JavaScript で TimeZone 文字列を指定して UTC オフセットを計算する 質問する

JavaScript で TimeZone 文字列を指定して UTC オフセットを計算する 質問する

標準JSライブラリ(ECMA5)を使用して、momentjsや外部ライブラリを使用せずに「Europe/Rome」や「America/Los_Angeles」などのタイムゾーン文字列が与えられた場合、UTC オフセットをどのように計算しますか?

UTC オフセットは、夏時間かどうかによって異なる可能性があるため、ソリューションでローカル クライアントの日付を指定されたタイムゾーン文字列に変換する必要がある場合は意味があります。目標は、UTC からのオフセットを知ることです。

function getUtcOffset(timezone) {
  // return int value. 
  // > 0 if +GMT 
  // < 0 if -GMT.
}

ベストアンサー1

ECMAScriptには関数はありません(ECMA-262) が見つかりました。これは、標準の ECMAScript では、ローカル コンピューターのタイム ゾーンと UTC 以外のタイム ゾーンについては何も認識されないためです。

ただし、ECMAScript Internationalization API(ECMA-402) をサポートし、IANA タイム ゾーン データベース識別子を完全にサポートしている場合は、次のような関数をハックできます。

function getTimezoneOffset(d, tz) {
  const a = d.toLocaleString("ja", {timeZone: tz}).split(/[/\s:]/);
  a[1]--;
  const t1 = Date.UTC.apply(null, a);
  const t2 = new Date(d).setMilliseconds(0);
  return (t2 - t1) / 60 / 1000;
}

これは現在のバージョンの Chrome では機能しますが、おそらく他のいくつかの場所でも機能します。ただし、すべての場所で機能することは保証されていません。特に、どのバージョンの Internet Explorer ブラウザでも機能しません。

使用例(Chrome の場合):

getTimezoneOffset(new Date(2016, 0, 1), "America/New_York") // 300
getTimezoneOffset(new Date(2016, 6, 1), "America/New_York") // 240
getTimezoneOffset(new Date(2016, 0, 1), "Europe/Paris") // -60
getTimezoneOffset(new Date(2016, 6, 1), "Europe/Paris") // -120

この特定の機能については、いくつか注意すべき点があります。

  • 前述したように、どこでも機能するわけではありません。最終的には、すべてのブラウザが最新の標準に追いつけば機能するようになりますが、現時点ではそうではありません。

  • 入力した日付は結果に影響します。これは夏時間やその他のタイムゾーンの異常によるものです。現在日付は のみですnew Date()が、関数を呼び出すタイミングによって結果が変わります。タイムゾーンタグ wiki

  • この関数の結果は分単位では-と同じでDate.getTimezoneOffset、正の値は西UTC の。ISO8601 オフセットを使用している場合は、時間に変換して符号を反転する必要があります。

  • この関数は、関数のタイムゾーン フォーマット機能に依存していますtoLocaleString'ja'日付部分が配列に対して既に正しい順序になっていたため、カルチャを選択しました。これは確かにハックです。フォーマット時にロケールにバインドせずにタイムゾーン情報にアクセスできる API があれば理想的です。残念ながら、この特定の API の設計者は、タイムゾーンをロケールに関連付けるという間違いを犯しました。これは、さまざまな言語の他のいくつかの API で犯された間違いであり、残念ながらここで JavaScript に持ち込まれました。

    簡単に言うと、ECMA-402のタイムゾーン機能は、次の場合にタイムゾーンを適用することだけです。文字列の書式設定これは設計上の欠陥だと私は思います。

  • 上記の使用例のセクションにはバグがあり、このAPIがなぜ間違いなのかを部分的に例示しています。具体的には、タイムゾーンを指定する方法がありません。作成するオブジェクトDate。私が渡す1月1日と7月1日の日付は、地元タイムゾーンは、指定されたタイムゾーンではありません。したがって、遷移の近くでは、出力が期待どおりにならない可能性があります。この問題を回避するために、さらにハッキングすることもできますが、それは皆さんの課題として残しておきます。

繰り返しになりますが、この回答は求められている基準を満たしていますが、外部ライブラリが関係していないため、強くお勧めします。に対してこれを本番コードで使用する。これを使って何か重要なことをする予定なら、ここに挙げた図書館の1つ

おすすめ記事