Frage

Meine JSON -Zeichenfolge enthält ein Datumsfeld, das einen solchen Wert zurückgibt:

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

Ich bin besonders daran interessiert, nur das Datumskompartiment zu analysieren, nicht die Zeit. Ich habe versucht, eine Reviver -Funktion zu verwenden, aber interessanterweise wird die Reviver -Funktion nie aufgerufen! (auf Firefox versucht)

Hier ist mein Code, um das zu erreichen:

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 ruft niemals an dateReviver.

Ich habe einen ganzen Tag investiert, aber kein Glück! Könnte mir bitte jemand helfen?

War es hilfreich?

Lösung

  1. Der reguläre Ausdruck erwartet eine "Zulu" -Timezone (ein 'z'-Zeichen am Ende), während die Stichproben-Datumsstring eine numerische Zeitzone (' -04: 00 ') zeigt. Der folgende Regex akzeptiert beide:

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

    Wenn die Zeitzonen -Ziffern nicht Null sind, möchten Sie möglicherweise das Datum nach der Parsen und/oder Konvertierung in UTC ändern, um die Zeitzone zu respektieren.

  2. Ich kann sehen, dass DataReviver () getroffen wird. Probieren Sie Folgendes in einem Browser aus:

    <!-- 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>
    

    Ich bekomme das Folgende im Browser, was auf eine erfolgreiche Parsen hinweist:

    Sat Apr 4 15:55:16 PDT 2009
    

Andere Tipps

Unter Verwendung von Typenript lautet meine Lösung wie folgt:

    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;
}

Das Beste aller Welten ;-) Es verwendet ein anonymer DataeReviver, das von JSON.Parse auf jeder Eigenschaft aufgerufen wird. Die Reviver -Logik besteht darin, zu überprüfen, ob die Eigenschaft vom Typ Zeichenfolge ist und ob sie wie der Beginn eines Datums aussieht ... wenn es sich um ein Datum handelt, dann lassen Sie das neue Datum (Wert) das tatsächliche Parsen ... alle Timezone -Variationen werden auf diese Weise unterstützt.

Ich hoffe es hilft!

Die Erweiterung der Einstellung von jQuery.ajax -Konvertern hat für mich aus dem Standardeinsatz gut funktioniert:

"text json": jQuery.parseJSON

zu

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

Die Verwendung von return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6]));

Passt das Datum für die Zeitzone -Informationen nicht an, die -4:00 Im Beispiel.

Eine Alternative besteht darin, Datum () das Parsen für Sie durchzuführen:

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

Wenn der JSON mit JSON.Stringify () formatiert worden wäre, wäre es in UTC (Z) gewesen.

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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top