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;
}