Pregunta

Mi cadena JSON contiene un campo de fecha que los rendimientos de valor tales a:

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

Me interesa sobre todo en el análisis no sólo el compartimento de la fecha del tiempo. He intentado utilizar una función resucitador, pero es interesante que la función resucitador no se invoca nunca! (Tratado en Firefox)

Aquí está mi código para llevar a cabo lo siguiente:

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 en loadArticle nunca llama dateReviver.

invirtió todo un día, pero no hubo suerte! ¿Alguien podría ayudarme por favor?

¿Fue útil?

Solución

  1. La expresión regular espera una zona horaria "Zulu" (Un carácter 'Z' al final), mientras que los programas de ejemplo de cadena de fecha y hora de una zona horaria numérico ( '-04: 00'). La siguiente expresión regular aceptará tanto:

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

    Si los dígitos de la zona horaria no son cero, puede que desee modificar realmente la fecha después del análisis y / o la conversión a UTC, a respetar la zona horaria.

  2. Puedo ver dateReviver) ser golpeado (. Intente lo siguiente en un navegador:

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

    Me estoy haciendo lo siguiente en el navegador, lo que indica el análisis éxito:

    Sat Apr 4 15:55:16 PDT 2009
    

Otros consejos

El uso de TypeSript, mi solución es la siguiente:

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

Lo mejor de todos los mundos ;-) Utiliza un datereviver anónima, que es llamada por JSON.parse en cada propiedad. La lógica resucitador es comprobar si la propiedad es de tipo cadena y si es así, si parece que el comienzo de una fecha ... Si se trata de una fecha, a continuación, dejar que la nueva fecha (valor) hacer el análisis real ... todas las variaciones de zona horaria se apoyan esa manera.

Hope que ayuda!

La extensión de los convertidores jQuery.ajax ajuste fino trabajó para mí de su del defecto:

"text json": jQuery.parseJSON

a

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

El uso de return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6]));

no ajusta la fecha para la información de zona horaria, la -4:00 en el ejemplo.

Una alternativa es dejar que la fecha () hacer el análisis para usted:

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

Si el JSON había sido formateado con JSON.stringify () habría sido en 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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top