JSON String modifie l'heure de la date en raison de l'UTC

Les objets de ma date dans JavaScript sont toujours représentés par UTC +2 en raison de l'endroit où je me trouve. C'est comme ça

Mon Sep 28 10:00:00 UTC+0200 2009 

Le problème est de faire un JSON.stringify convertit la date ci-dessus en

 2009-09-28T08:00:00Z (notice 2 hours missing ie 8 instead of 10) 

Ce dont j'ai besoin, c'est pour la date et l'heure d'être honoré, mais ce n'est pas le cas, il devrait être

 2009-09-28T10:00:00Z (this is how it should be) 

Fondamentalement, j'utilise ceci:

 var jsonData = JSON.stringify(jsonObject); 

J'ai essayé de passer un paramètre de remplacement (second paramètre sur stringify), mais le problème est que la valeur a déjà été traitée.

J'ai également essayé d'utiliser toString() et toUTCString() sur l'objet date, mais ceux-ci ne me donnent pas ce que je veux non plus.

Quelqu'un peut-il m'aider?

Récemment, j'ai rencontré le même problème. Et il a été résolu en utilisant le code suivant:

 x = new Date(); x.setHours(x.getHours() - x.getTimezoneOffset() / 60); 

JSON utilise la fonction Date.prototype.toISOString qui ne représente pas l'heure locale – elle représente l'heure de l'UTC non modifié – si vous regardez la sortie de votre date, vous pouvez voir que vous êtes en UTC + 2 heures, c'est pourquoi la chaîne JSON Change de deux heures, mais si cela permet au même temps de se représenter correctement dans plusieurs fuseaux horaires.

Juste pour mémoire, n'oubliez pas que le dernier "Z" dans "2009-09-28T08: 00: 00Z" signifie que le temps est en UTC.

Voir http://en.wikipedia.org/wiki/ISO_8601 pour plus de détails.

Voici une autre réponse (et personnellement, je pense que c'est plus approprié)

 var currentDate = new Date(); currentDate = JSON.stringify(currentDate); // Now currentDate is in a different format... oh gosh what do we do... currentDate = new Date(JSON.parse(currentDate)); // Now currentDate is back to its original form :) 

Habituellement, vous souhaitez que les dates soient présentées à chaque utilisateur dans son propre temps local,

C'est pourquoi nous utilisons GMT (UTC).

Utilisez Date.parse (jsondatestring) pour obtenir la chaîne d'heure locale,

À moins que vous souhaitiez que votre heure locale s'affiche à chaque visiteur.

Dans ce cas, utilisez la méthode d'Anatoly.

Je suis un peu en retard, mais vous pouvez toujours écraser la fonction toJson en cas de Date à l'aide de Prototype comme tel:

 Date.prototype.toJSON = function(){ return Util.getDateTimeString(this); }; 

Dans mon cas, Util.getDateTimeString (ceci) renvoie une chaîne comme celle-ci: "2017-01-19T00: 00: 00Z"

Tout se résume à si votre backend de serveur est agnostique ou non. Si ce n'est pas le cas, vous devez supposer que le fuseau horaire du serveur est le même que le client, ou transférer des informations sur la fuseau horaire du client et l'inclure également dans les calculs.

Un exemple basé sur le backend PostgreSQL:

 select '2009-09-28T08:00:00Z'::timestamp -> '2009-09-28 08:00:00' (wrong for 10am) select '2009-09-28T08:00:00Z'::timestamptz -> '2009-09-28 10:00:00+02' select '2009-09-28T08:00:00Z'::timestamptz::timestamp -> '2009-09-28 10:00:00' 

Le dernier est probablement ce que vous souhaitez utiliser dans la base de données, si vous n'êtes pas disposé à mettre en œuvre correctement la logique du fuseau horaire.

Au lieu de toJSON , vous pouvez utiliser une fonction de format qui donne toujours la date et l'heure exactes + GMT

C'est l'option d'affichage la plus robuste. Il faut une chaîne de jetons et les remplace par leurs valeurs correspondantes.

moment.js ce problème en utilisant la bibliothèque moment.js (la version hors fuseau horaire).

 var newMinDate = moment(datePicker.selectedDates[0]); var newMaxDate = moment(datePicker.selectedDates[1]); // Define the data to ask the server for var dataToGet = {"ArduinoDeviceIdentifier":"Temperatures", "StartDate":newMinDate.format('YYYY-MM-DD HH:mm'), "EndDate":newMaxDate.format('YYYY-MM-DD HH:mm') }; alert(JSON.stringify(dataToGet)); 

J'utilisais la bibliothèque flatpickr.min.js . L'heure de l'objet JSON résultant créé correspond à l'heure locale fournie, mais au sélecteur de date.

Date.toJSON () imprime la date UTC dans une chaîne formatée (ajoute alors le décalage lors de la conversion au format JSON).

 date = new Date(); new Date(date.getTime() - (date.getTimezoneOffset() * 60000)).toJSON();