web-dev-qa-db-ja.com

異なるブラウザでのtoLocaleString()の一貫性のない動作

私は日付と時刻をたくさん扱わなければならないプロジェクトに取り組んでいます。サーバー側のテクノロジはASP.Netであり、クライアント側ではjQueryとjQuery Week Calendar(jQueryプラグイン)を使用しています。

これが説明されている問題です。サーバーからGMT形式の_2012-11-13T04:45:00.00_のようなデータ時間を受信して​​います。

クライアント側では、IST、EST、PKTなどのように、この日時をロケール日時形式に変換する必要があります。

これを実現するために、JavaScriptメソッドtoLocaleString()を使用しています。これはChromeでのみ正常に機能し、他のブラウザでは一貫性がありません。

さまざまなブラウザでの出力は次のとおりです。

Google Chrome(正常に動作します):

コール:

_new Date ("2012-11-13T04:45:00.00").toLocaleString();
_

出力:

_Tue Nov 13 2012 10:15:00 GMT+0530 (India Standard Time)
_

Mozilla Firefox:

コール:

_new Date ("2012-11-13T04:45:00.00").toLocaleString();
_

出力:

_Tuesday, November 13, 2012 4:45:00 AM
_

Safari:

コール:

_new Date ("2012-11-13T04:45:00.00").toLocaleString();
_

出力:

_Invalid Date
_

Internet Explorer:

コール:

_new Date ("2012-11-13T04:45:00.00").toLocaleString();
_

出力:

_Tuesday, November 13, 2012 4:45:00 AM
_

今のところ、これらは私がテストしたブラウザです。

ここに質問

使用しているブラウザクライアントに関係なく、データ時刻(この_2012-11-13T04:45:00.00_のような形式)をロケールの日付と時刻に変換する方法が必要です。

11
Ishan Dhingra

簡単な答えはノーです。 toLocaleStringは、開発者が望む方法で実装できます。あなたの質問が意味するのは、Chrome出力必要な文字列)です。

そのフォーマットを一貫して出力したい場合は、 DateJS のような別のライブラリを使用する必要があります。

DateJSでこれを行うには、core.jsで使用できるいくつかの標準形式指定子と、extras.jsでのみ使用できるいくつかの標準形式指定子が必要になります。ドキュメントには すべてのフォーマット指定子 のリストがあります。

必要な文字列は次のとおりです。

Tue Nov 13 2012 10:15:00 GMT+0530 (India Standard Time)

したがって、DateJSからこれを取得するには、次のものが必要です。

"D M d Y H:i:s \G\M\TO (e)"

DateJSの構文は次のとおりです。

new Date ("2012-11-13T04:45:00.00").format("D M d Y H:i:s \G\M\TO (e)");
11
funwhilelost

サーバー上で時刻をロケール固有の文字列に変換するには、メソッド DateTime.ToLongDateString を使用できます。そのページで、クラス DateTimeFormatInfo の(サーバー上の)「現在のカルチャーオブジェクト」に関する注記を参照してください。正しく設定されていることを確認してください。

2
eh9

この問題の根本的な原因は、どの回答でも解決されませんでした。 OPは言った:

サーバーからこの2012-11-13T04:45:00.00のようなデータ時間をGMT形式で受信しています。

GMTはフォーマットではありません。この文字列はISO8601拡張形式であり、タイムゾーンは指定されていません。 ISO 8601仕様では、修飾子がない場合、これは現地時間を表すことを目的としています。 GMTを指定するには、末尾にZを追加するか、+00:00などのオフセットを追加します。

問題は、ECMAScript(v1-v5.1)が仕様のこの規定を尊重していなかったことです。実際には、現地時間ではなくUTCとして解釈する必要があると言われています。一部のブラウザはISO仕様を尊重し、一部のブラウザはECMA仕様を尊重しました。これはバージョン6で修正されており、ほとんどのブラウザが準拠しています。

つまり、UTC/GMTベースのタイムスタンプを送信する場合は、サーバー側で常にZを送信して、あいまいさがないようにする必要があります。

それでも、valueが正しく解釈されたとしても、文字列がブラウザ間で同じ形式になるという保証はありません。そのためには、確かにライブラリが必要です。 moment.js をお勧めしますが、他にもあります。

0