Dans mon application Java Script, la date est stockée dans un format comme celui-ci:
2011-09-24
Maintenant, lorsque j'essaie d'utiliser la valeur ci-dessus pour créer un nouvel objet Date (afin de pouvoir récupérer la date dans un format différent), la date revient toujours un jour de congé. Voir ci-dessous:
var doo = new Date("2011-09-24");
console.log(doo);
journaux:
Fri Sep 23 2011 20:00:00 GMT-0400 (Eastern Daylight Time)
javascript
date
levi
la source
la source
Réponses:
Notez que l'heure d'été est
-4 hours
et que les heures à la date de votre retour sont20
.qui est minuit du 2011-09-24. La date a été analysée en UTC (GMT) car vous avez fourni une chaîne de date uniquement sans indicateur de fuseau horaire. Si vous aviez donné une chaîne date / heure sans indicateur à la place (
new Date("2011-09-24T00:00:00")
), elle aurait été analysée dans votre fuseau horaire local. (Historiquement, il y a eu des incohérences, notamment parce que la spécification a changé plusieurs fois, mais les navigateurs modernes devraient être corrects; ou vous pouvez toujours inclure un indicateur de fuseau horaire.)Vous obtenez la bonne date, vous n'avez simplement jamais spécifié le bon fuseau horaire.
Si vous devez accéder aux valeurs de date, vous pouvez utiliser
getUTCDate()
ou l' une des autresgetUTC*()
fonctions :la source
EDT
est l' heure avancée (aussi connu comme l' heure d'été) ,EST
est le fuseau horaire applicable en Janvier.new Date('2012-01-01 GMT')
il applique toujours un décalage car il le convertit en heure locale de l'utilisateur.get*
méthodes et en avez besoin pour retourner la date / heure correcte, y compris le décalage de fuseau horaire inconnu, ajoutez simplement le décalage de fuseau horaire inconnu:d = new Date('2013-01-08 GMT'); d.setMinutes(d.getMinutes() + d.getTimezoneOffset());
cela normalisera la date aux paramètres régionaux de l'utilisateur afin que les.get*
méthodes reviennent la valeur attendue. Les.getUTC*
méthodes seront alors incorrectes, alors soyez prudent.Il y a plusieurs choses folles qui se produisent avec un objet JS DATE qui convertit des chaînes, par exemple, considérez la date suivante que vous avez fournie
Si vous fournissez des arguments distincts au constructeur Date, vous pouvez obtenir d'autres sorties utiles comme décrit ci-dessous
Remarque: les arguments peuvent être de type Number ou String. Je vais montrer des exemples avec des valeurs mixtes.
la source
Pour normaliser la date et éliminer le décalage indésirable (testé ici: https://jsfiddle.net/7xp1xL5m/ ):
Cela accomplit également la même chose et mérite @tpartee (testé ici: https://jsfiddle.net/7xp1xL5m/1/ ):
la source
doo.setMinutes(doo.getMinutes() + doo.getTimezoneOffset())
Si vous souhaitez obtenir l'heure 0 d'une date dans le fuseau horaire local, transmettez les parties de date individuelles au
Date
constructeur.la source
Je veux juste ajouter que, apparemment, l'ajout d'un espace à la fin de la chaîne utilisera UTC pour la création.
Edit: Ce n'est pas une solution recommandée, juste une réponse alternative. Veuillez ne pas utiliser cette approche car il est très difficile de savoir ce qui se passe. Il existe un certain nombre de façons dont quelqu'un pourrait refactoriser ce problème, provoquant accidentellement un bogue.
la source
Je pense que cela a à voir avec l'ajustement du fuseau horaire. La date que vous avez créée est en GMT et l'heure par défaut est minuit, mais votre fuseau horaire est EDT, il soustrait donc 4 heures. Essayez ceci pour vérifier:
la source
Votre problème concerne spécifiquement le fuseau horaire. Notez une partie
GMT-0400
- c'est que vous avez 4 heures de retard sur GMT. Si vous ajoutez 4 heures à la date / heure affichée, vous obtiendrez exactement minuit 2011/09/24. UtiliseztoUTCString()
plutôt la méthode pour obtenir la chaîne GMT:la source
Ce n'est probablement pas une bonne réponse, mais je veux juste partager mon expérience avec ce problème.
Mon application utilise globalement la date utc au format 'AAAA-MM-JJ', tandis que le plugin datepicker que j'utilise n'accepte que la date js, il m'est difficile de considérer à la fois utc et js. Donc, quand je veux passer une date au format 'AAAA-MM-JJ' à mon sélecteur de date, je la convertis d'abord au format 'MM / JJ / AAAA' en utilisant moment.js ou tout ce que vous voulez, et la date affichée sur le sélecteur de date est maintenant correct. Pour votre exemple
Apparemment, d1 est ce que je veux. J'espère que cela serait utile pour certaines personnes.
la source
Ceci à travers moi pour une boucle, +1 sur la réponse de zzzBov. Voici une conversion complète d'une date qui a fonctionné pour moi en utilisant les méthodes UTC:
la source
Cela signifie
2011-09-24 00:00:00 GMT
, et puisque vous y êtesGMT -4
, ce sera20:00
la veille.Personnellement, je comprends
2011-09-24 02:00:00
, parce que je visGMT +2
.la source
Bien que dans le cas de l'OP, le fuseau horaire est EDT, rien ne garantit que l'utilisateur exécutant votre script sera dans le fuseau horaire EDT, donc le codage en dur du décalage ne fonctionnera pas nécessairement. La solution que j'ai trouvée fractionne la chaîne de date et utilise les valeurs distinctes dans le constructeur Date.
Notez que vous devez prendre en compte un autre élément de bizarrerie JS: le mois est basé sur zéro.
la source
J'ai rencontré ce problème exact lorsque mon client était à l'heure normale de l'Atlantique. La valeur de date que le client a récupérée était "2018-11-23" et lorsque le code l'a transmise à
new Date("2018-11-23")
la sortie pour le client, c'était la veille. J'ai créé une fonction utilitaire comme indiqué dans l'extrait de code qui a normalisé la date, donnant au client la date attendue.date.setMinutes(date.getMinutes() + date.getTimezoneOffset());
la source
si vous cherchez simplement à vous assurer que les différentes parties de la date restent les mêmes à des fins d'affichage, * cela semble fonctionner, même lorsque je change de fuseau horaire:
il suffit d'ajouter les zéros là-dedans.
Dans mon code, je fais ceci:
Et je change de fuseau horaire sur mon ordinateur et la date reste la même que la chaîne de date aaaa-mm-jj que j'obtiens de l'API.
Mais est-ce que je manque quelque chose / est-ce une mauvaise idée?
* au moins en chrome. Cela ne fonctionne pas dans Safari! au moment de la rédaction de cet article
la source
.toISOString()
, cela remonte à 1 jour.new Date('2019/11/18 05:30:00').toISOString();
a travaillé pour moiLa meilleure façon de gérer cela sans utiliser plus de méthodes de conversion,
Maintenant, ajoutez simplement GMT dans votre date ou vous pouvez l'ajouter.
En direct: https://jsfiddle.net/gajender/2kop9vrk/1/
la source
J'ai rencontré un problème comme celui-ci. Mais mon problème était le décalage lors de l'obtention de la date de la base de données.
ceci est tracé dans la base de données et il est au format UTC.
Donc, quand je reçois de la base de données et vérifie la date, il ajoute un décalage avec elle et renvoie à javascript.
Il ajoute +05: 00 car il s'agit du fuseau horaire de mon serveur. Mon client est sur un fuseau horaire différent +07: 00.
Voici donc ma solution ce que je fais avec ce problème.
Ainsi, lorsque la date provient du serveur et que le serveur est décalé, je divise la date et supprime le décalage du serveur, puis convertis en date. Cela résout mon problème.
la source
si vous avez besoin d'une solution simple pour cela, voir:
la source
Vous utilisez le format de chaîne de date ISO qui, selon cette page , entraîne la construction de la date à l'aide du fuseau horaire UTC:
Si vous formatez le texte différemment, par exemple
"Jan 01 1970"
, (au moins sur ma machine), il utilise votre fuseau horaire local.la source
Essayer d'ajouter mes 2 cents à ce fil (en développant la réponse @ paul-wintz).
Il me semble que lorsque le constructeur Date reçoit une chaîne qui correspond à la première partie du format ISO 8601 (partie date), il effectue une conversion de date précise dans le fuseau horaire UTC avec 0 heure. Lorsque cette date est convertie en heure locale, un décalage de date peut se produire si minuit UTC est une date antérieure dans le fuseau horaire local.
Si la chaîne de date est dans un autre format "plus lâche" (utilise "/" ou la date / mois n'est pas complétée par zéro), elle crée la date dans le fuseau horaire local, donc pas de problème de décalage de date.
Ainsi, une solution rapide, comme mentionné ci-dessus, consiste à remplacer "-" par "/" dans votre chaîne au format ISO uniquement.
la source
Pour stocker
yyyy-mm-dd
au format MySql Date, vous devez procéder comme suit:la source
Votre journal génère GMT afin que vous souhaitiez spécifier votre fuseau horaire:
la source
peu importe, n'a pas remarqué le GMT -0400, ce qui fait que la date est hier
Vous pouvez essayer de définir une «heure» par défaut à 12:00:00
la source
Ce qui suit a fonctionné pour moi -
la source