2016-04-06 11 views
1

APIから日付オブジェクトを取得しています。DateオブジェクトはChromeでは有効ですがSafari、Firefox、IEでは無効です

「は2016年4月5日13:39:46.612が」ここAPIから返される形式です

Chromeはこれを解釈し、それを正しく表示するようだが、しかし、Firefoxの、サファリ、およびIEで、私はどちらかを取得しますnullまたは無効な日付。

クローム結果:

console.log(purchaseDate) 
>> Tue Apr 05 2016 13:39:46 GMT-0500 (CDT) 

角度ビューでこのHTML:{{$ scope.purchaseDate |日付: 'MMM dを、YH:ミリメートルA'}} 出力:2016年4月5日13:39(SafariとIEについても同様)

Firefoxの結果:

console.log(purchaseDate) 
>> Invalid Date 

このHTMLで角度表示:{{$ scope.purchaseDate |

私はmoment.jsを使用して日付をフォーマットしてみましたが、これは(類似の質問に対する回答として示唆されているように)ブラウザに送信していますが、その日付は 'MMM d、yh:mm a'結果ははるかに良いではありません:(SafariとIEについても同様)

console.log(moment(purchaseDate).format()) 
>> 2016-04-05T13:39:46-05:00 

Firefoxの結果:

クローム結果

console.log(moment(purchaseDate).format()) 
>> Invalid Date 

アイデア私は既にコード内のどこかで使用しているので、一貫性解析を行うためにmoment.jsを使用したいと思います。

私は同様の問題を持っていたし、私のために最善の解決策は、日付文字列解析するmomentjsライブラリを使用することだったと思う
+0

最初の呼び出しで* moment.js *に書式を渡す必要があります。そうでない場合は、文字列を解析するときに推測するだけです。 – RobG

+0

実際にAPIから直接文字列として渡される形式の場合は、APIに戻ってISO-8601のような賢明なものに変更してください。しかし、私の推測では、APIの結果を既に 'Date'オブジェクトに解析していて、' Date'の 'string'への暗黙の変換を実際に見ていると思います。あなたはAPIから出てくる正確な文字列ですか?生のHTTPを見てください。 –

+0

APIの返品に影響を与えることはできますか?もしそうなら、最良の解決策は、この形式のデータを返さないことです。かなり狂っています。 – shabunc

答えて

0

:例えば

bower install --save moment 

、その後を:

$scope.purchaseDate = moment("2016-04-05 13:39:46.612", "YYYY-MM-DD HH:mm:ss.SSS").toDate(); 

は、フォーマットを解析ご覧くださいここでは例えばHTMLページ内のhttp://momentjs.com/docs/#/parsing/string-format/

{{purchaseDate | date:'medium'}} 

momentjsは、あなたの地域のタイムゾーンの世話をし、日付がそれに応じて、私はそれが役に立てば幸い

を変更することを注意してください。

+0

私はこの正確なことを試して、まだChrome以外のブラウザでnull /無効な日付を取得しています。 –

+0

私はあなたの意見を持っています:$ scope.purchaseDate =瞬間( "2016-04-05 13:39:46.612"、 "YYYY-MM-DD HH:mm:ss.SSS")toDate(); – thegio

+0

http://jsfiddle.net/Lqu0rpv4/ – thegio

0

モーメントを角度で使用する場合は、angular-momentも使用する必要があります。

値をロードするときは、Dateオブジェクトの代わりにmomentオブジェクトを作成します。

var purchaseDate = moment("2016-04-05 13:39:46.612"); 

この特定のフォーマットは、すでに瞬時に認識されています。jsなので、解析するときにフォーマット文字列を指定する必要はありません。ただし、ローカルと解釈されることに注意してください。あなたの代わりにUTCでそれを望んでいた場合、:

var purchaseDate = moment.utc("2016-04-05 13:39:46.612"); 

いずれかの方法で、あなたはそれをフォーマットする角度モーメントを使用することができます。

{{$scope.purchaseDate | amDateFormat:'MMM D, Y h:mm a'}} 

角度モーメントはまた、あなたが使用できる他のフィルタの多くを提供しますもし良かったら。 Check out their docs

+0

私は角モーメントがあなたの瞬間に弦を変換すると信じています。前処理する必要はありません。しかし、それを長い間使っていないので、私にそれを引用しないでください。 –

+0

@MaggiePint - 良い点。文字列を直接解析できます。私はそれが瞬間オブジェクトまたは日付オブジェクトでも動作すると思いますが、しばらくテストしていません。 –

+0

ソースコードを読むと、このユースケースでは瞬間コンストラクタに直接渡されるようです。したがって、文字列、瞬間、日付、ミリ秒単位の整数、およびASP.NETの醜い日付文字列がすべて動作するはずです。あなたは数秒で整数を持っている場合、あなたは何か他のことをしなければなりません。 –

関連する問題