Mes objets de date en JavaScript sont toujours représentés par UTC +2 en raison de l'endroit où je me trouve. Par conséquent comme ça
Mon Sep 28 10:00:00 UTC+0200 2009
Le problème est de faire une JSON.stringify
conversion de la date ci-dessus en
2009-09-28T08:00:00Z (notice 2 hours missing i.e. 8 instead of 10)
Ce dont j'ai besoin, c'est que la date et l'heure soient honorées, mais ce n'est pas le cas, donc cela 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 (deuxième paramètre sur stringify) mais le problème est que la valeur a déjà été traitée.
J'ai aussi essayé d'utiliser toString()
et toUTCString()
sur l'objet date, mais cela ne me donne pas non plus ce que je veux ..
Quelqu'un peut-il m'aider?
javascript
json
datetime
utc
Mark Smith
la source
la source
2009-09-28T10:00:00Z
ne représente pas le même moment dans le temps queMon Sep 28 10:00:00 UTC+0200 2009
. LeZ
dans une date ISO 8601 signifie UTC, et 10 heures en UTC est un moment différent de 10 heures en +0200. Ce serait une chose de vouloir que la date soit sérialisée avec le bon fuseau horaire, mais vous nous demandez de vous aider à la sérialiser en une représentation qui est sans équivoque, objectivement fausse .Réponses:
Récemment, j'ai rencontré le même problème. Et il a été résolu en utilisant le code suivant:
la source
JSON utilise la
Date.prototype.toISOString
fonction qui ne représente pas l'heure locale - elle représente l'heure en UTC non modifiée - si vous regardez votre sortie de date, vous pouvez voir que vous êtes à UTC + 2 heures, c'est pourquoi la chaîne JSON change de deux heures, mais si cela permet à la même heure d'être représentée correctement sur plusieurs fuseaux horaires.la source
Pour mémoire, rappelez-vous que le dernier "Z" dans "2009-09-28T08: 00: 00Z" signifie que l'heure est bien en UTC.
Voir http://en.wikipedia.org/wiki/ISO_8601 pour plus de détails.
la source
Voici une autre réponse (et personnellement je pense que c'est plus approprié)
la source
date.toJSON () imprime la date UTC dans une chaîne formatée (ajoute donc le décalage avec elle lors de la conversion au format JSON).
la source
date.getTime()
renvoie le temps en millisecondes, donc nous devrions également convertir le deuxième opérande en millisecondes. Puisque lesdate.getTimezoneOffset()
retours sont décalés en minutes, nous le multiplions par 60000, car 1 minute = 60000 millisecondes. Donc, en soustrayant le décalage de l'heure actuelle, nous obtenons l'heure en UTC.vous pouvez utiliser moment.js pour formater avec l'heure locale:
la source
Je suis un peu en retard mais vous pouvez toujours écraser la fonction toJson dans le cas d'une Date utilisant Prototype comme ceci:
Dans mon cas, Util.getDateTimeString (this) renvoie une chaîne comme celle-ci: "2017-01-19T00: 00: 00Z"
la source
Habituellement, vous voulez que les dates soient présentées à chaque utilisateur dans sa propre heure locale-
c'est pourquoi nous utilisons GMT (UTC).
Utilisez Date.parse (jsondatestring) pour obtenir la chaîne d'heure locale,
sauf si vous souhaitez que votre heure locale soit affichée à chaque visiteur.
Dans ce cas, utilisez la méthode d'Anatoly.
la source
Contourné ce problème en utilisant la
moment.js
bibliothèque (la version sans fuseau horaire).J'utilisais la
flatpickr.min.js
bibliothèque. L'heure de l'objet JSON résultant créé correspond à l'heure locale fournie mais au sélecteur de date.la source
Solution
JSON.stringify
prête à l'emploi pour forcer l' ignorance des fuseaux horaires:Utilisation de la bibliothèque moment.js:
la source
Je rencontre cela un peu en travaillant avec des trucs hérités où ils ne fonctionnent que sur la côte est des États-Unis et ne stockent pas les dates en UTC, tout est EST. Je dois filtrer sur les dates en fonction de l'entrée de l'utilisateur dans le navigateur, je dois donc transmettre la date en heure locale au format JSON.
Juste pour élaborer sur cette solution déjà publiée - c'est ce que j'utilise:
Donc, je crois comprendre que cela va aller de l'avant et soustraire le temps (en millisecondes (donc 60000) de la date de départ en fonction du décalage du fuseau horaire (renvoie les minutes) - en prévision de l'ajout de temps à JSON () va ajouter.
la source
Voici quelque chose de vraiment soigné et simple (du moins je crois que oui :)) et ne nécessite aucune manipulation de la date pour être cloné ou surcharger l'une des fonctions natives du navigateur comme toJSON (référence: Comment JSON stringifier une date javascript et préserver le fuseau horaire , courtise Shawson)
Passez une fonction de remplacement à JSON.stringify qui stringifie les choses à votre guise !!! De cette façon, vous n'avez pas à faire des différences d'heures et de minutes ou toute autre manipulation.
J'ai mis dans console.logs pour voir les résultats intermédiaires afin que ce qui se passe et comment fonctionne la récursivité soit clair. Cela révèle quelque chose qui mérite d'être remarqué: le paramètre de valeur à remplacer est déjà converti au format de date ISO :). Utilisez cette [touche] pour travailler avec les données originales.
la source
JavaScript convertit normalement le fuseau horaire local en UTC.
la source
Tout se résume à savoir si le backend de votre serveur est indépendant du fuseau horaire ou non. Si ce n'est pas le cas, vous devez supposer que le fuseau horaire du serveur est le même que celui du client, ou transférer des informations sur le fuseau horaire du client et les inclure également dans les calculs.
un exemple basé sur le backend PostgreSQL:
Le dernier est probablement ce que vous souhaitez utiliser dans la base de données, si vous ne souhaitez pas implémenter correctement la logique de fuseau horaire.
la source
Au lieu de
toJSON
, vous pouvez utiliser la fonction de format qui donne toujours la date et l'heure correctes +GMT
la source
J'ai essayé ceci en angulaire 8:
créer un modèle:
dans votre composant
envoyer la date à votre API pour la sauvegarder
Lors du chargement de vos données depuis l'API, vous ferez ceci:
model.YourDate = new Date(model.YourDate+"Z");
vous obtiendrez votre date correctement avec votre fuseau horaire.
la source