.Net webApi ISO datetime和IE8

时间:2012-09-06 17:07:03

标签: javascript .net datetime browser asp.net-web-api

.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不会窒息?

2 个答案:

答案 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能够解析该日期。扩展其中一个内置模式以处理时区方面并不难。