6

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

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

 

Firefoxはこれをうまく処理します。Chromeを試したことがありません。IE8が壊れ、NaNが返されます。  

ISO日付は私のWebAPIで使用するのに適した形式だと思います。また、Javascriptクライアントで現地時間への変換とDateTimeの再フォーマットを処理して、読みやすくしたいと考えています。そのため、ISO日付を文字列として保持するだけでなく、Date型を使用しています。  

これらすべてを考えると、IE8が詰まらないようにISO DateTime形式を処理するための最良の方法は何ですか?    

4

2 に答える 2

3

Date() コンストラクターは、文字列を入力として使用すると信頼性が低すぎると思います。

@Garrett はここで問題を説明しています --

Date を設定する確実な方法は、日付を作成し、setFullYear メソッドと setTime メソッドを使用することです。

彼はここでリンク、関数、および詳細を提供します: https://stackoverflow.com/a/2182529/644492

完全な ISO DateTime UTC 文字列入力を受け取り、後で Date ゲッターで操作できる 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;
}
于 2012-09-07T05:38:14.203 に答える
0

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

于 2012-09-06T20:47:54.357 に答える