jQuery date format - 我如何格式化微软的JSON日期?

JS date to string / jquery / asp.net / ajax / json

我正在使用jQuery在Ajax上进行首次尝试。我正在将数据获取到页面上,但是在为Date数据类型返回的JSON数据时遇到了一些麻烦。基本上,我得到的字符串看起来像这样:

/Date(1224043200000)/

参考:这是我用这里的答案组合得出的解决方案。

function getMismatch(id) {
  $.getJSON("Main.aspx?Callback=GetMismatch",
    { MismatchId: id },

    function (result) {
      $("#AuthMerchId").text(result.AuthorizationMerchantId);
      $("#SttlMerchId").text(result.SettlementMerchantId);
      $("#CreateDate").text(formatJSONDate(Date(result.AppendDts)));
      $("#ExpireDate").text(formatJSONDate(Date(result.ExpiresDts)));
      $("#LastUpdate").text(formatJSONDate(Date(result.LastUpdateDts)));
      $("#LastUpdatedBy").text(result.LastUpdateNt);
      $("#ProcessIn").text(result.ProcessIn);
    }
  );

  return false;
}

function formatJSONDate(jsonDate) {
  var newDate = dateFormat(jsonDate, "mm/dd/yyyy");
  return newDate;
}

16 revs, 9 users 40%



Answer #1

1)检测微软日期格式

//处理Microsoft AJAX日期,格式类似于'/ Date(01238329348239)/'
function looksLikeMSDate(s) {
    return /^\/Date\(/.test(s);
}

2)检测ISO日期格式

var isoDateRegex = /^(\d\d\d\d)-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d)(\.\d\d?\d?)?([\+-]\d\d:\d\d|Z)?$/;

function looksLikeIsoDate(s) {
    return isoDateRegex.test(s);
}

3)解析MS日期格式。

function parseMSDate(s) {
    //向前跳过/ Date(,parseInt处理其余部分
    return new Date(parseInt(s.substr(6)));
}

4a)解析标准ISO日期格式,应对oldIE的问题。

function parseIsoDate(s) {
    var m = isoDateRegex.exec(s);

    //是UTC,偏移量还是未定义?将undefined视为UTC。
    if (m.length == 7 ||                //仅ym-dTh:m:s,没有ms,没有tz偏移-假定为UTC
        (m.length > 7 && (
            !m[7] ||                    //数组返回长度9,未定义长度7和8
            m[7].charAt(0) != '.' ||    // ms部分,无tz偏移,或no ms部分,Z
            !m[8] ||                    // ms部分,无tz偏移
            m[8] == 'Z'))) {            // ms部分和Z
        // JavaScript的怪异日期处理期望仅以0为基础的月份,如0-11,而不是1-12-其余部分与您期望的日期相同。
        var d = new Date(Date.UTC(m[1], m[2]-1, m[3], m[4], m[5], m[6]));
    } else {
        // 当地的
        var d = new Date(m[1], m[2]-1, m[3], m[4], m[5], m[6]);
    }

    return d;
}

4b)用固定的三个毫秒的小数位来解析ISO格式--更容易。

function parseIsoDate(s) {
    return new Date(s);
}

5)格式化它。

function hasTime(d) {
    return !!(d.getUTCHours() || d.getUTCMinutes() || d.getUTCSeconds());
}

function zeroFill(n) {
    if ((n + '').length == 1)
        return '0' + n;

    return n;
}

function formatDate(d) {
    if (hasTime(d)) {
        var s = (d.getMonth() + 1) + '/' + d.getDate() + '/' + d.getFullYear();
        s += ' ' + d.getHours() + ':' + zeroFill(d.getMinutes()) + ':' + zeroFill(d.getSeconds());
    } else {
        var s = (d.getMonth() + 1) + '/' + d.getDate() + '/' + d.getFullYear();
    }

    return s;
}

6)将一切联系起来。

function parseDate(s) {
    var d;
    if (looksLikeMSDate(s))
        d = parseMSDate(s);
    else if (looksLikeIsoDate(s))
        d = parseIsoDate(s);
    else
        return null;

    return formatDate(d);
}

如果你在ASP.NET MVC中使用jQuery 1.4的Ajax函数,你可以把所有的DateTime属性变成Date对象,用。

// 一次
jQuery.parseJSON = function(d) {return eval('(' + d + ')');};

$.ajax({
    ...
    dataFilter: function(d) {
        return d.replace(/"\\\/(Date\(-?\d+\))\\\/"/g, 'new $1');
    },
    ...
});