Monday, May 20, 2024
 Popular · Latest · Hot · Upcoming
183
rated 0 times [  187] [ 4]  / answers: 1 / hits: 17726  / 15 Years ago, tue, november 24, 2009, 12:00:00

My JSON string contains a date field that returns such a value:



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


I am particularly interested in parsing only the date compartment not the time. I tried using a reviver function, but interestingly the reviver function is never invoked! (tried on Firefox)



Here is my code to accomplish that:



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 never calls dateReviver.



I invested a whole day but no luck! Could someone please help me?


More From » json

 Answers
84

  1. The regular expression expects a Zulu timezone (A 'Z' character at the end), while the sample date-time string shows a numeric timezone ('-04:00'). The following regex will accept both:



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


    If the time zone digits are not zero, you might want to actually modify the date after parsing and/or converting to UTC, to respect the timezone.


  2. I can see dateReviver() being hit. Try the following in a browser:



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


    I am getting the following in the browser, indicating successful parsing:



    Sat Apr 4 15:55:16 PDT 2009


[#98235] Friday, November 20, 2009, 15 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
andrewb

Total Points: 259
Total Questions: 124
Total Answers: 90

Location: Ivory Coast
Member since Sun, Mar 7, 2021
3 Years ago
;