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


94

私は日付文字列をDateJavaScriptで変換したいのですが、このコードを使用します:

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/

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


2
それは同じコンピューター上ですか?
アーロンディグラ2013

4
@Sandeepの要点は、Chromeではタイムゾーンオフセットが追加されますが、Firefoxではタイムゾーンオフセットが追加されないということです
デフォルトロケール

3
@CuongLe持っているあなたはこの質問を見た:stackoverflow.com/questions/9062863/...
デフォルトロケールの

1
それDate {Wed Feb 27 2013 17:00:00 GMT+0000 (GMT)}は私とLinuxの両方に対応しています。
素晴らしい

1
Nitpickerのコーナー:«JSON形式のUTC時間» -JSON 形式?正確には、JSONに関する一般的な不満は、日付形式がまったく定義されていないことです。
アルバロゴンザレス

回答:


66

UTCの正しい形式は2013-02-27T17:00:00Z(Zはズールー時間)です。Z存在しない場合は追加して、正しいUTC日時文字列を取得します。


2
ありがとう。これは機能します。しかし、ログには、それは将来廃止される予定です!!!があります。何かアイデアはありますか?
デボラ2016年

1
どうもありがとう、私はこの問題を2日間抱えていましたが、この投稿はすべてを解決しました。
Piyal George、2017

30

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

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

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


2
しかし、スペック(15.9.1.15)が、実際に言う:Z「『』オフセット不在の時間帯の値が」 -それは実装に依存すべきではないので
sinelaw

12
OK、修正。ES5.1仕様の誤りのようです。Zの欠落が現地時間を意味するISO-8601に一致させることを意図していました(したがって、ChromeはES5.1に一致し、FirefoxとIEはISO-8601に一致します)
sinelaw

@sinelaw:その点をさらに調査していただきありがとうございます。ただし、仕様に記載されている内容に関係なく、[古い]ブラウザーはまだ別の方法で実行しています:-)
Bergi

2
奇妙なことに、Date.Parseと新しいDateを使用すると、Chromeが日付をローカルタイムゾーンとして処理するのではなく、ローカルタイムゾーンに変換するという問題が修正されました。
KingOfHypocrites 2014

1
@KingOfHypocrites — 文字列を使用してDateコンストラクター呼び出すことは、Date.parseを使用することと同じであると想定されているため、少し奇妙です
RobG、2015年

4

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


-2

moment.jsを使用してみてください。これは、すべてのブラウザで非常によく似た方法で動作します。には多くのフォーマットオプションが付属しています。New Date( 'date')の代わりにmoment( 'date')。format( "")を使用します


-2

FireFoxがChromeと同じ結果を返さなかったことがわかりました。日付のkendo.toStringで使用する形式が違いを生むようです。

最後のコンソール結果は私が必要としたものです:

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.