解析iso日期在jQuery ajax json响应

Parsing iso dates in jQuery ajax json response

本文关键字:ajax json 响应 jQuery iso 日期 解析      更新时间:2023-09-26

我在json格式的jQuery-ajax响应中解析日期有问题。

客户端代码:

$.ajax({
    url: '/index',
    dataType: 'json',
    success: function (data) {
        console.log(data.date);
    }
});

服务器正在发送json:

{
    "name": "john",
    "date": "2013-07-01T00:00:00",
}

运行客户端代码后,我在控制台中收到一个字符串内容:

2013-07-01T00:00:00

不是日期类型。我认为这将由解析器完成。在json解析期间,我必须做些什么才能自动解析我的日期 ?

克里斯

Ok,我从http://erraticdev.blogspot.com/2010/12/converting-dates-in-json-strings-using.html:找到了一个很好的解决方案

/*!
 * jQuery.parseJSON() extension (supports ISO & Asp.net date conversion)
 *
 * Version 1.0 (13 Jan 2011)
 *
 * Copyright (c) 2011 Robert Koritnik
 * Licensed under the terms of the MIT license
 * http://www.opensource.org/licenses/mit-license.php
 */
(function ($) {
    // JSON RegExp
    var rvalidchars = /^['],:{}'s]*$/;
    var rvalidescape = /''(?:["'''/bfnrt]|u[0-9a-fA-F]{4})/g;
    var rvalidtokens = /"[^"'''n'r]*"|true|false|null|-?'d+(?:'.'d*)?(?:[eE][+'-]?'d+)?/g;
    var rvalidbraces = /(?:^|:|,)(?:'s*'[)+/g;
    var dateISO = /'d{4}-'d{2}-'d{2}T'd{2}:'d{2}:'d{2}(?:[.,]'d+)?Z?/i;
    var dateNet = /'/Date'(('d+)(?:-'d+)?')'//i;
    // replacer RegExp
    var replaceISO = /"('d{4})-('d{2})-('d{2})T('d{2}):('d{2}):('d{2})(?:[.,]('d+))?Z?"/i;
    var replaceNet = /"'''/Date'(('d+)(?:-'d+)?')'''/"/i;
    // determine JSON native support
    var nativeJSON = (window.JSON && window.JSON.parse) ? true : false;
    var extendedJSON = nativeJSON && window.JSON.parse('{"x":9}', function(k,v){return "Y";}) === "Y";
    var jsonDateConverter = function(key, value) {
        if (typeof(value) === "string") {
            if (dateISO.test(value)) {
                if (value == '0001-01-01T00:00:00') {
                    return null;
                }
                return new Date(value);
            }
            if (dateNet.test(value))
            {
                return new Date(parseInt(dateNet.exec(value)[1], 10));
            }
        }
        return value;
    };
    $.extend({
        parseJSON: function(data, convertDates) {
            /// <summary>Takes a well-formed JSON string and returns the resulting JavaScript object.</summary>
            /// <param name="data" type="String">The JSON string to parse.</param>
            /// <param name="convertDates" optional="true" type="Boolean">Set to true when you want ISO/Asp.net dates to be auto-converted to dates.</param>
            if (typeof data !== "string" || !data) {
                return null;
            }
            // Make sure leading/trailing whitespace is removed (IE can't handle it)
            data = $.trim(data);
            // Make sure the incoming data is actual JSON
            // Logic borrowed from http://json.org/json2.js
            if (rvalidchars.test(data
                .replace(rvalidescape, "@")
                .replace(rvalidtokens, "]")
                .replace(rvalidbraces, "")))
            {
                // Try to use the native JSON parser
                if (extendedJSON || (nativeJSON && convertDates !== true))
                {
                    return window.JSON.parse(data, convertDates === true ? jsonDateConverter : undefined);
                }
                else {
                    data = convertDates === true ?
                        data.replace(replaceISO, "new Date(parseInt('$1',10),parseInt('$2',10)-1,parseInt('$3',10),parseInt('$4',10),parseInt('$5',10),parseInt('$6',10),(function(s){return parseInt(s,10)||0;})('$7'))")
                            .replace(replaceNet, "new Date($1)"):
                        data;
                    return (new Function("return " + data))();
                }
            } else
            {
                $.error("Invalid JSON: " + data);
            }
        }
    });
})(jQuery);

用法:

$.ajax({
    url: '/index',
    // dataType: 'json', <- remove it
    converters: {
        "text json": function (data) {
            return $.parseJSON(data, true);
        }
    },
    success: function (data) {
        console.log(data.date);
    }
});

就像这样

var myDate = new Date("2013-07-01T00:00:00")

JavaScript开箱即用支持ISO 8601解析