自动转换$ .AJAX响应中的所有日期

时间:2016-09-30 16:32:56

标签: jquery asp.net json ajax json.net

我正在使用jQuery向我的ASP.NET MVC应用程序执行ajax请求,在“success”处理程序中,我收到一个使用Json.NET序列化的ISO-8601格式的日期对象:

response = {
  FirstDate: "2001-11-11T00:00:00Z"
  SecondDate: "2002-22-22T00:00:00Z"
}

之后我需要手动转换所有这些日期才能使用它们:

var firstParsedDate = new Date(response.MyDate);
var secondParsedDate = new Date(response.MyDate);

有没有办法接收已经解析过日期的响应对象? 如果没有,他们可以一次解析吗?

2 个答案:

答案 0 :(得分:1)

您可以使用jQuery的each()对每个值执行一个函数 出于演示目的,我添加了toString()

response = {
  FirstDate: "2001-11-11T00:00:00Z",
  SecondDate: "2002-22-22T00:00:00Z"
}

$.each(response,function(i, v) {
  response[i]=new Date(v).toString();
});

console.log(response);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

以下是使用排除无效日期的map()的替代示例:

var response = {
    FirstDate: "2001-11-11T00:00:00Z",
    SecondDate: "2002-22-22T00:00:00Z",
    ThirdDate: "1995-08-22T05:23Z",
  },

  valid_dates = $.map(response, function(v, i) {
    return Date.parse(v) ? new Date(v).toString() : null;
  });

console.log(valid_dates);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

答案 1 :(得分:1)

您可以创建一个递归函数,该函数将通过响应对象并自动将符合ISO 8601格式的任何字符串转换为Date对象。这样的事情应该有效:

function replaceIso8601StringsWithDates(obj)
{
    if (obj !== null && typeof (obj) === "object" && !Array.isArray(obj)) {
        for (var prop in obj) {
            if (isIso8601String(obj[prop])) {
                obj[prop] = new Date(obj[prop]);
            }
            else {
                replaceIso8601StringsWithDates(obj[prop]);
            }
        }
    }
}

var iso8601Regex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{1,6})?(Z|[+-]\d{2}:\d{2})$/;
function isIso8601String(val) {
    return typeof (val) === "string" && iso8601Regex.test(val);
}

然后在你的success处理程序中,你只需要调用函数:

function success(data, status, xhr) {
    replaceIso8601StringsWithDates(data);
    ...
}