Как использовать параметр json.parse reviver, чтобы разобрать строку даты

StackOverflow https://stackoverflow.com/questions/1792865

Вопрос

Моя строка JSON содержит поле даты, которое возвращает такое значение:

"2009-04-04T22:55:16.0000000-04:00"

Я особенно заинтересован в том, чтобы анализировать только отсек даты, а не время. Я попытался использовать функцию Reviver, но интересно, что функция Reviver никогда не вызывается! (Пробовал на Firefox)

Вот мой код, чтобы сделать это:

var Site = {
.....
dateReviver: function(key, value) {
    var a;
    if (typeof value === 'string') {
        a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
        if (a) {
            return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
                            +a[5], +a[6]));
        }
    }
    return value;
},
loadArticle: function(id) {
....
    proxy.getArticle(id, function(response) {
        var data = JSON.parse(response.result, Site.dateReviver);
        ....
    });
}
};

Json.parse in loadArticle никогда не звонит dateReviver.

Я вложил целый день, но не повезло! Может ли кто -нибудь, пожалуйста, помочь мне?

Это было полезно?

Решение

  1. Регулярное выражение ожидает часового пояса «Zulu» (символ «Z» в конце), в то время как в строке даты даты образца показана числовая часовая пояса ('-04: 00'). Следующая регуляция примет оба:

    /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)(Z|([+\-])(\d{2}):(\d{2}))$/
    

    Если цифры часового пояса не равны нулю, вы можете фактически изменить дату после анализа и/или преобразования в UTC, чтобы уважать часовой пояс.

  2. Я вижу, как DateReviver () поразит. Попробуйте следующее в браузере:

    <!-- saved from url=(0014)about:internet -->
    <html>
        <head>
            <script src="http://www.json.org/json2.js"></script>
            <script type="text/javascript" src="http://ajax.Microsoft.com/ajax/jQuery/jquery-1.3.2.js"></script>
            <script>
                $(function () {
                    // a mock proxy to return some json to play with
                    var proxy = {
                        getArticle: function(id, foo) { foo({
                            result: '["2009-04-04T22:55:16.0000000-04:00"]'
                        }); }
                    };
                    // the origial Site object, with the fixed regex
                    var Site = {
                        dateReviver: function(key, value) {
                            var a;
                            if (typeof value === 'string') {
                                a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)(Z|([+\-])(\d{2}):(\d{2}))$/.exec(value);
                                if (a) {
                                    return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
                                                    +a[5], +a[6]));
                                }
                            }
                            return value;
                        },
                        loadArticle: function(id) {
                            proxy.getArticle(id, function(response) {
                                var data = JSON.parse(response.result, Site.dateReviver);
                                // put the parsed JSON date on the page
                                $("#output").html(data[0].toString());
                            });
                        }
                    };
                    // try out our Site object
                    Site.loadArticle();
                });
            </script>
        </head>
        <body>
            <div id="output"></div>
        </body>
    </html>
    

    Я получаю следующее в браузере, указывая на успешный анализ:

    Sat Apr 4 15:55:16 PDT 2009
    

Другие советы

Используя TypeRipt, мое решение заключается в следующем:

    export function parseWithDate(jsonString: string): any {
    var reDateDetect = /(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})/;  // startswith: 2015-04-29T22:06:55
    var resultObject = JSON.parse(jsonString,(key: any, value: any) => {
        if (typeof value == 'string' && (reDateDetect.exec(value))) {
            return new Date(value);
        }
        return value;
    });
    return resultObject;
}

Лучшее из всех миров ;-) Он использует анонимный DateReviver, который называется JSON.Parse на каждом свойстве. Логика Reviver состоит в том, чтобы проверить, имеет ли свойство строку типа, и если да, то выглядит ли оно в начале даты ... если это дата, то пусть новая дата (значение) сделает фактический анализ ... все Варианты часового пояса поддерживаются таким образом.

Надеюсь, поможет!

Расширение настройки преобразователей jQuery.ajax работало нормально для меня по умолчанию:

"text json": jQuery.parseJSON

к

"text json": function (xmlValue) {
            var value = JSON.parse(xmlValue, Site.dateReviver);
      return value;
      } 

Использование return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6]));

не регулирует дату для информации о часовом поясе, -4:00 в примере.

Альтернативой является дать дату () сделать для вас анализ:

var dateReviver = function (key, value) {
    var a;
    if (typeof value === 'string') {
        a = Date.parse(value);
        if (a) {
            return new Date(a);
        }    
    }
    return value;
}

Если бы JSON был отформатирован с помощью json.stringify (), он был бы в UTC (z).

function dateReviver (k,v) {

    var isnum = /^\d+$/.test(v);

    // Check if number since Date.parse(number) returns valid date
    if (isnum) {
        return v;
    }

    if (Date.parse(v)) {
        return new Date(Date.parse(v));
    }
    return v;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top