.Net WebAPI在序列化DateTime时默认使用ISO DateTime格式。 当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以便它易于阅读 - 这就是我使用Date类型而不仅仅是将ISO日期保持为字符串的原因。
鉴于这一切,我处理ISO DateTime格式的最佳方式是什么,以便IE8不会窒息?
答案 0 :(得分:3)
我认为Date()构造函数太过不可靠,而字符串作为输入。
@Garrett在这里描述了这个问题 -
设置Date的可靠方法是构造一个并使用 setFullYear和setTime方法。
他在这里提供了一个链接,一个函数和更多细节:https://stackoverflow.com/a/2182529/644492
我修改了函数以获取完整的ISO DateTime UTC字符串输入并返回一个UTC Date对象,我稍后可以使用Date getters操作它。
我丢弃毫秒,因为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 :(得分:0)
这不是一个完美的解决方案,但如果删除尾随的“Z”,this Javascript Date library能够解析该日期。扩展其中一个内置模式以处理时区方面并不难。