J'ai une page Web avec trois listes déroulantes pour le jour, le mois et l'année. Si j'utilise le Date
constructeur JavaScript qui prend des nombres, alors j'obtiens un Date
objet pour mon fuseau horaire actuel:
new Date(xiYear, xiMonth, xiDate)
Donnez la date correcte, mais il pense que la date est GMT + 01: 00 en raison de l'heure d'été.
Le problème ici est que je passe ensuite cela Date
à une méthode Ajax et lorsque la date est désérialisée sur le serveur, elle a été convertie en GMT et a donc perdu une heure, ce qui fait reculer la journée d'une unité. Maintenant, je pourrais simplement passer le jour, le mois et l'année individuellement dans la méthode Ajax, mais il semble qu'il devrait y avoir une meilleure façon.
La réponse acceptée m'a orienté dans la bonne direction, mais le simple fait d'utiliser setUTCHours()
en soi a changé:
Apr 5th 00:00 GMT+01:00
à
Apr 4th 23:00 GMT+01:00
J'ai ensuite dû également définir la date, le mois et l'année UTC pour finir avec
Apr 5th 01:00 GMT+01:00
c'est ce que je voulais.
Réponses:
en l'utilisant,
.setUTCHours()
il serait possible de définir des dates en temps UTC, ce qui vous permettrait d'utiliser des heures UTC dans tout le système.Cependant, vous ne pouvez pas le définir en utilisant UTC dans le constructeur, sauf si vous spécifiez une chaîne de date.À l'aide de,
new Date(Date.UTC(year, month, day, hour, minute, second))
vous pouvez créer un objet Date à partir d'une heure UTC spécifique.la source
Cette réponse est adaptée spécifiquement à la question d'origine et ne donnera pas la réponse que vous attendez nécessairement. En particulier, certaines personnes voudront soustraire le décalage du fuseau horaire au lieu de l'ajouter. Souvenez-vous cependant que le but de cette solution est de pirater l'objet date de javascript pour une désérialisation particulière, pour ne pas être correct dans tous les cas.
la source
*60*1000
c'est plus clair dans ce cas; en d'autres termes, il est assez évident pourquoi il est là.Je crois que vous avez besoin de la fonction createDateAsUTC (veuillez comparer avec convertDateToUTC )
la source
date
en fuseau horaire UTC, mais le second ne semble rien faire d'utile? (retourne la même date quedate
)Date
objet de JavaScript reflétera toujours l'époque Unix basée sur UTC et le fuseau horaire local . Le problème est apparent lorsque vous appeleztoString
l'objet de date résultant et que vous voyez toujours le fuseau horaire local, même si vous vous attendiez à ce qu'il soit en UTC.Date
objet JavaScript . Une autre façon de voir cela ici est d'Date.UTC
attendre des valeurs basées sur UTC, et vous lui fournissez des valeurs d'heure locale, et vice-versa avec leDate
constructeur.Réglez simplement le fuseau horaire et revenez selon
la source
Je ne crois pas que cela soit possible - il n'y a pas de possibilité de définir le fuseau horaire sur un objet Date après sa création.
Et d'une certaine manière, cela a du sens - conceptuellement (sinon peut-être dans la mise en œuvre); par http://en.wikipedia.org/wiki/Unix_timestamp (accent sur le mien):
Une fois que vous en aurez construit un, il représentera un certain point en temps "réel". Le fuseau horaire n'est pertinent que lorsque vous souhaitez convertir ce point temporel abstrait en une chaîne lisible par l'homme.
Il est donc logique que vous ne puissiez modifier l'heure réelle que la date représente dans le constructeur. Malheureusement, il semble qu'il n'y ait aucun moyen de passer dans un fuseau horaire explicite - et le constructeur que vous appelez (sans doute correctement) traduit vos variables de temps "locales" en GMT lorsqu'il les stocke de manière canonique - il n'y a donc aucun moyen d'utiliser le
int, int, int
constructeur pour Horaires GMT.Sur le plan positif, il est trivial d'utiliser simplement le constructeur qui prend une chaîne à la place. Vous n'avez même pas besoin de convertir le mois numérique en une chaîne (au moins sur Firefox), alors j'espérais qu'une implémentation naïve fonctionnerait. Cependant, après l'avoir essayé, il fonctionne avec succès dans Firefox, Chrome et Opera mais échoue dans Konqueror ("Date non valide"), Safari ("Date non valide") et IE ("NaN"). Je suppose que vous auriez juste un tableau de recherche pour convertir le mois en chaîne, comme ceci:
la source
Je sais que c'est vieux mais si cela vous aide, vous pouvez utiliser le moment et le fuseau horaire. Si vous ne les avez pas vus, jetez un œil.
http://momentjs.com/timezone/
http://momentjs.com/
deux bibliothèques de manipulation du temps très pratiques.
la source
Si vous souhaitez traiter le problème légèrement différent, mais connexe, de la création d'un objet Javascript Date à partir de l'année, du mois, du jour, ..., y compris le fuseau horaire - c'est-à-dire, si vous souhaitez analyser une chaîne en une date - alors vous doivent apparemment faire une danse exaspérante et compliquée:
C'est-à-dire que vous créez une `` heure UTC '' en utilisant la date sans fuseau horaire (afin que vous sachiez dans quel lieu il se trouve, à savoir le `` lieu '' UTC, et il n'est pas défini par défaut sur l'heure locale), puis appliquez manuellement le décalage de fuseau horaire indiqué.
Cela n'aurait-il pas été bien si quelqu'un avait réellement pensé à l'objet date Javascript pendant plus de, oooh, cinq minutes ...
la source
pour tous les décalages d'emplacement Liste Wiki des décalages horaires UTC
la source
getTimeZoneOffset est négatif pour UTC + z.
la source
Cela peut aider quelqu'un, mettre UTC à la fin de ce que vous passez au nouveau constructeur
Au moins en chrome on peut dire
var date = new Date("2014-01-01 11:00:00 UTC")
la source
+0000
(remarquez que l'espace entre 00 et UTC doit être supprimé) et cela fonctionnera à la fois sur Firefox et Chrome. Pas sûr pour Safari cependant. (Référence: stackoverflow.com/a/17545854/1273587 )Solution en une ligne
Au lieu de 1422524805305, utilisez l'horodatage en millisecondes Au lieu de 330, utilisez le décalage de votre fuseau horaire en minutes wrt. GMT (par exemple, l'Inde +5: 30 est 5 * 60 + 30 = 330 minutes)
la source
la source
Le moyen le plus simple que j'ai trouvé pour obtenir la date correcte est d'utiliser datejs.
http://www.datejs.com/
Je reçois mes dates via Ajax dans ce format sous forme de chaîne: '2016-01-12T00: 00: 00'
La console affichera:
Lun 11 janvier 2016 19:00:00 GMT-0500 (heure normale de l'Est)
Mar 12 janvier 2016 00:00:00 GMT-0500 (heure normale de l'Est)
https://jsfiddle.net/vp1ena7b/3/
Les 'addMinutes' viennent de datejs, vous pourriez probablement le faire vous-même en pur js, mais j'avais déjà des datejs dans mon projet, j'ai donc trouvé un moyen de l'utiliser pour obtenir les dates correctes.
Je pensais que cela pourrait aider quelqu'un ...
la source
tout kilométrage en
la source
Ce code renverra votre objet Date formaté avec le fuseau horaire du navigateur .
Éditer:
Pour éviter de polluer l'API Date, la fonction ci-dessus peut être transformée en fonction utilitaire. La fonction prend un objet Date et retourne un objet Date muté.
la source
La meilleure solution que j'ai vue de cela est venue de
http://www.codingforums.com/archive/index.php/t-19663.html
Fonction de temps d'impression
Exemple de code complet
la source
si vous voulez vérifier la différence de temps entre deux dates, vous pouvez simplement vérifier si le deuxième fuseau horaire est inférieur ou supérieur au premier fuseau horaire souhaité et soustraire ou ajouter une heure.
la source
GMT -03: 00 Exemple
Ou même
la source
Cela a fonctionné pour moi. Je ne sais pas si c'est une bonne idée.
la source
J'ai utilisé le package timezone-js.
la source
C'est la MEILLEURE solution
En utilisant:
Code:
Version café:
la source