web-dev-qa-db-ja.com

新しいDate()はChromeとFirefoxで異なる動作をします

Javascriptで日付文字列をDateに変換するには、次のコードを使用します。

var date = new Date('2013-02-27T17:00:00');
alert(date);

'2013-02-27T17:00:00'は、サーバーからのJSONオブジェクトのUTC時間です。

ただし、上記のコードの結果はFirefoxとChromeで異なります。

Firefoxが返します:

Wed Feb 27 2013 17:00:00 GMT+0700 (SE Asia Standard Time)

Chromeは以下を返します。

Thu Feb 28 2013 00:00:00 GMT+0700 (SE Asia Standard Time) 

1日は異なりますが、私が期待する正しい結果はChromeからの結果です。

デモコード: http://jsfiddle.net/xHtqa/2/

両方から同じ結果を得るためにこの問題を修正するにはどうすればよいですか?

90
cuongle

UTCの正しい形式は2013-02-27T17:00:00Z(ZはZulu Timeの略)です。正しいUTC日時文字列を取得するためにZが存在しない場合は追加します。

65
Petr Abdulin

残念ながら、日付解析アルゴリズムは実装に依存しています。 Date.parseの仕様new Date で使用される)から:

文字列は、文字列の内容に応じて、ローカル時間、UTC時間、または他のタイムゾーンの時間として解釈される場合があります。この関数は、最初にDate Time String Format( 15.9.1.15 )で呼び出された規則に従って、Stringの形式を解析しようとします。文字列がその形式に準拠していない場合、関数は実装固有のヒューリスティックまたは実装固有の日付形式にフォールバックする場合があります。

Dateコンストラクター をローカルタイムゾーンを使用しないようにする(たぶん)には、タイムゾーン情報を含む日時文字列を使用します。 "2013-02-27T17:00:00Z"。ただし、すべてのブラウザーで信頼できる構文解析された形式を見つけるのは困難です-ISO形式はIE <8で認識されません( JavaScript:Date.parseでISO-8601日付文字列の解析をサポートするブラウザー)を参照 )。より良いのは、Unixタイムスタンプ、つまり nix Epoch からのミリ秒を使用するか、正規表現を使用してその部分の文字列を分解し、それらを Date.UTC にフィードすることです。

29
Bergi

ここで一つ見つけました。ネイティブのFirefox Inspectorコンソールにバグがある可能性があります:ネイティブのInspectorで「new Date()」を実行すると、間違ったタイムゾーン、GMTロケールで日付が表示されますが、Firebug Extension Consoleで同じコマンドを実行すると、日付表示されているのは正しいタイムゾーン(GMT-3:00)を使用しています。

3
Sergio Abreu

Moment.jsを使用してみてください。それは非常にうまくいき、すべてのブラウザで同様の方法で行われます。多くの書式設定オプションが付属しています。 New Date( 'date')の代わりにmoment( 'date')。format( "")を使用します

0
MSIslam