28

最近、JavaScript に新しい拡張機能があることを発見しました。これにより、および関数のDateオブジェクトにいくつかの機能が追加されます。 ここを参照してくださいtoLocaleStringtoLocaleDateStringtoLocaleTimeString

やなどのIANA/Olson タイム ゾーンtimeZoneをサポートするオプションに特に興味があります。 これは現在、Google Chrome でのみサポートされていますAmerica/New_YorkEurope/London

以前のアドバイスでは、JavaScript で UTC 以外のタイム ゾーンまたは独自のローカル タイム ゾーンを使用するには、ライブラリを使用する必要があるというものでした。しかし今では、これがブラウザに直接組み込まれ始めているようです。だから今、あなたはこれを行うことができます:

new Date().toLocaleString("en-US", {timeZone: "America/New_York"})

// output: "7/4/2013 5:15:45 PM"

または:

new Date().toLocaleString("en-NZ", {timeZone: "Pacific/Chatham",
                                    timeZoneName: "long"})

// output:  "7/5/2013 9:59:52 AM GMT+12:45"

または:

new Date().toLocaleString("en-GB", {timeZone: "Europe/London",
                                    timeZoneName: "short"})

// output:  "4/7/2013 22:18:57 United Kingdom Time"
// (strange time zone name, but ok)

これは非常にクールですが、いくつか質問があります。

  • これは新しい規格の一部ですか? ECMAScript 6 のどこかに埋もれているのではないでしょうか? それともChromeのカスタムですか?
  • なぜGoogle Chromeだけ?他の場所でサポートされていますか? 他の場所でサポートする予定はありますか?
  • Chrome の JavaScript ランタイムを使用する node.js を確認しましたが、動作しません。なぜだめですか?
  • リストした機能以外の方法でタイム ゾーン データにアクセスできますか? 文字列をフォーマットするときにのみ使用できる場合、結果に基づいて計算を行うのは難しい場合があります。
  • これは出力に焦点を当てていますが、入力にはどのように使用しますか? コンストラクターのタイムゾーンをDateオブジェクトに渡す方法はありますか? 私は次のことを試しました:

    // parsing it with a date and time
    new Date("2013-01-01 12:34:56 America/New_York")
    
    // passing it as a named option
    new Date(2013,0,1,12,34,56,{timeZone:"America/New_York"})
    

    どちらも機能しませんでした。仕様書には何も載っていなかったので、これは(まだ)存在しないと思いますが、間違っていたら教えてください。

  • ECMAScript 5 仕様の欠陥によって作成されたこの投稿で説明されている問題は、正しいデータが TZDB にある場合でも、依然として出力に影響を与えます。古い実装と新しい実装が共存しているのはなぜですか? それはすべて古い方法か、またはすべて新しい方法であると考える人もいるでしょう。たとえば、コンピューターのタイム ゾーンが米国東部時間に設定されている場合:

    new Date(2004,10,7,0,0).toLocaleString("en-US",{timeZone:"America/New_York"})
    

    戻ります"11/6/2004 11:00:00 PM"。真夜中に開始し、ローカル タイム ゾーンが出力タイム ゾーンと一致するため、真夜中に返されるはずです。ただし、ES5 の問題により、提供された入力日付が間違った UTC ポイントに配置されます。

  • IANA が TZDB の更新をリリースすると、Google が変更を含む Chrome の更新をプッシュすることを期待できますか?

4

2 に答える 2

6

これは新しい規格の一部ですか? ECMAScript 6 のどこかに埋もれているのではないでしょうか? それともChromeのカスタムですか?

実際、これは新しい ECMA-402 標準の一部です。標準は非常に読みにくいですが、このわかりやすい紹介があります。

なぜGoogle Chromeだけ?他の場所でサポートされていますか? 他の場所でサポートする予定はありますか?

MDN には、サポートされているブラウザのリストがありますBug 853301によると、Firefox 25 で利用可能になります。

Chrome の JavaScript ランタイムを使用する node.js を確認しましたが、動作しません。なぜだめですか?

考えられる理由はたくさんあります。現在のコード ベースに対応していないか、node.js が大きく遅くなります (Mozilla からの以前のバグ トラッカー エントリは、タイムゾーン データが Firefox のダウンロード サイズを 10 % 増加させ、I/O の原因となったことを示しています)。ブラウザの起動時に大幅に増加します。

リストした機能以外の方法でタイム ゾーン データにアクセスできますか? 文字列をフォーマットするときにのみ
使用できる場合、結果に基づいて計算を行うのは難しい場合があります。

利用できないようです。さらに、国際 API の入門書では、UTC とローカル タイム ゾーンのみをサポートすることが絶対に必要であると述べています。

これは出力に焦点を当てていますが、入力にはどのように使用しますか? コンストラクターのタイムゾーンを Date オブジェクトに渡す方法はありますか? 私は次のことを試しました:

Intl API は、日付/時刻のフォーマット、文字列の照合、および数値のフォーマットについてのみ話します。日時の書式設定は、グレゴリオ暦だけでなく、太陰暦、太陰太陽暦など、さまざまな種類の他の暦にも対応しています。

ECMAScript 5 仕様の欠陥によって作成されたこの投稿で説明されている問題は、正しいデータが TZDB にある場合でも、依然として出力に影響を与えます。古い実装と新しい実装が共存しているのはなぜですか? それはすべて古い方法か、またはすべて新しい方法であると考える人もいるでしょう。たとえば、コンピューターのタイム ゾーンが米国東部時間に設定されている場合:

new Date(2004,10,7,0,0).toLocaleString("en-US",{timeZone:"America/New_York"})

「11/6/2004 11:00:00 PM」を返します。真夜中に開始し、ローカル タイム ゾーンが出力タイム ゾーンと一致するので、それは真夜中を返すはずです。しかし、ES5 の問題により、提供された入力日付が > 間違った UTC ポイントに配置されます。

その理由は、11 月 6 日が EDT ではないにもかかわらず、新しい Date への入力が現在の DST とオフセットを使用して計算されることを ES5 が義務付けているためです。明らかに、これはそのように指定されているため、変更することはできません。ただし、Chrome は TZDB を使用して裸の UTC ポイントインタイム値からアメリカ/ニューヨーク tz への変換を行うため、時刻は EST にあると見なされます。

IANA が TZDB の更新をリリースすると、Google が変更を含む Chrome の更新をプッシュすることを期待できますか?

そう信じたい

于 2013-07-30T22:32:09.343 に答える