2012-09-06 19 views
6

.Net WebAPIは、DateTimeをシリアル化するときに、デフォルトでISO DateTime形式を使用します。 IE8が新しいDate()コンストラクタでこのISO DateTime形式を使用しようとすると、NaNを返してブレークします。 .Net webApi ISO datetimeとIE8

var d = new Date('2012-09-06T15:28:56.215Z'); 
alert(d); 

Firefoxは、この罰金を処理します。 Chromeを試していない。 IE8が壊れ、NaNが返されます。

私のWebAPIで使用するには、ISOの日付が適切なフォーマットであると仮定しています。 また、Javascriptクライアントが現地時間に変換して、DateTimeを再フォーマットして読みやすいようにしたいので、ISOの日付を文字列として保持するのではなく、Date型を使用しています。

IE8がチョークしないように、ISO DateTimeフォーマットを処理するにはどうすればいいですか?

答えて

2

Date()コンストラクタは、入力として文字列ではあまりにも信頼性が低いと思います。

@Garrettは、ここでの問題について説明します -

日を設定するための信頼性の高い方法は、1を構築し、 にsetFullYearとのsetTimeメソッドを使用することです。

彼は、リンク、機能、そしてここで詳細を与える:https://stackoverflow.com/a/2182529/644492

私は完全なISOのDateTime UTC文字列の入力を取り、私は後日に操作することができUTCのDateオブジェクトを返す関数を修正ゲッター。

IE8のDateコンストラクタでミリ秒が追加されないため、ミリ秒が短くなりました。

私の変更は、おそらく完全ではない - 正規表現は最後に少し緩んでいると、ブロックをチェックし、そのフォーマットは、おそらく私の新しい入力形式に変更する必要があります...

/**Parses string formatted as YYYY-MM-DDThh:mm:ss.sZ 
* or YYYY-MM-DDThh:mm:ssZ (for IE8), to a Date object. 
* If the supplied string does not match the format, an 
* invalid Date (value NaN) is returned. 
* @param {string} dateStringInRange format YYYY-MM-DDThh:mm:ss.sZ, 
* or YYYY-MM-DDThh:mm:ssZ - Zulu (UTC) Time Only, 
* with year in range of 0000-9999, inclusive. 
* @return {Date} Date object representing the string. 
*/ 

function parseISO8601(dateStringInRange) { 
    var isoExp = /^\s*(\d{4})-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d).*Z\s*$/, 
     date = new Date(NaN), month, 
     parts = isoExp.exec(dateStringInRange); 
    if (parts) { 
     month = +parts[2]; 
     date.setUTCFullYear(parts[1], month - 1, parts[3]); 
     date.setUTCHours(parts[4]); 
     date.setUTCMinutes(parts[5]); 
     date.setUTCSeconds(parts[6]); 
     if(month != date.getUTCMonth() + 1) { 
      date.setTime(NaN); 
     } 
    } 
    return date; 
} 
+1

ワン補正: '場合(month!= date.getMonth()+ 1) 'は' if(month!= date.getUTCMonth()+ 1) 'でなければなりません。 – Grinn

0

this Javascript Date libraryは完璧な解決策ではありませんが、末尾の "Z"が削除された場合はその日付を解析できます。タイムゾーンの側面を処理するために組み込みのパターンの1つを拡張することは難しくありません。

関連する問題