【问题标题】:Parsing iso dates in jQuery ajax json response在jQuery ajax json响应中解析iso日期
【发布时间】:2013-04-17 02:10:29
【问题描述】:

我在以 json 格式解析我的 jQuery-ajax 响应中的日期时遇到问题。

我的客户端代码:

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

服务器正在发送 json:

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

运行客户端代码后,我在控制台中收到 string 内容:

2013-07-01T00:00:00

这不是日期类型。我认为这将由解析器完成。我需要做什么才能在 json 解析期间自动解析日期

克里斯

【问题讨论】:

    标签: javascript ajax json jquery


    【解决方案1】:

    好的,我从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);
        }
    });
    

    【讨论】:

    • 你真的只是用了“nice”这个词吗!? ;-D
    • 即使在保留 dataType: "json" 时效果也很好
    【解决方案2】:

    就这样

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

    JavaScript 支持开箱即用的 ISO 8601 解析

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    • 1970-01-01
    • 2013-05-14
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多