我认为 Date() 构造函数对于字符串作为输入来说太不可靠了。
@Garrett 在这里描述了这个问题——
设置 Date 的一种可靠方法是构造一个并使用 setFullYear 和 setTime 方法。
他在这里给出了一个链接、一个函数和更多细节:https ://stackoverflow.com/a/2182529/644492
我修改了函数以获取完整的 ISO DateTime UTC 字符串输入并返回一个 UTC Date 对象,以后我可以使用 Date getter 来操作该对象。
我删除了毫秒,因为 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;
}