Dans une application JS, je reçois l'horodatage (eq. 1270544790922
) Du serveur (Ajax).
Sur la base de cet horodatage, je crée un Date
objet en utilisant:
var _date = new Date();
_date.setTime(1270544790922);
Désormais, _date
horodatage décodé dans le fuseau horaire des paramètres régionaux de l'utilisateur actuel. Je ne veux pas de ça.
Je voudrais _ date
convertir cet horodatage en heure actuelle dans la ville d'Helsinki en Europe (sans tenir compte du fuseau horaire actuel de l'utilisateur).
Comment puis je faire ça?
javascript
date
timezone
warpech
la source
la source
Réponses:
La valeur sous-jacente d'un objet Date est en fait en UTC. Pour le prouver, notez que si vous tapez ,
new Date(0)
vous verrez quelque chose comme:Wed Dec 31 1969 16:00:00 GMT-0800 (PST)
. 0 est traité comme 0 en GMT, mais la.toString()
méthode affiche l'heure locale.Remarque importante, UTC signifie code horaire universel . L'heure actuelle à 2 endroits différents est la même heure UTC, mais la sortie peut être formatée différemment.
Ce dont nous avons besoin ici, c'est d'un formatage
Cela fonctionne mais ... vous ne pouvez pas vraiment utiliser les autres méthodes de date pour vos besoins puisqu'elles décrivent le fuseau horaire de l'utilisateur. Ce que vous voulez, c'est un objet de date lié au fuseau horaire d'Helsinki. Vos options à ce stade sont d'utiliser une bibliothèque tierce (je le recommande), ou de pirater l'objet de date afin que vous puissiez utiliser la plupart de ses méthodes.
Option 1 - une tierce partie comme moment-fuseau horaire
Cela semble beaucoup plus élégant que ce que nous sommes sur le point de faire ensuite.
Option 2 - Pirater l'objet de date
Il pense toujours que c'est GMT-0700 (PDT), mais si vous ne regardez pas trop fort, vous pourrez peut-être confondre cela avec un objet de date utile pour vos besoins.
J'ai facilement sauté une partie. Vous devez être capable de définir
currentHelsinkiOffset
. Si vous pouvez utiliserdate.getTimezoneOffset()
du côté serveur, ou simplement utiliser des instructions if pour décrire quand les changements de fuseau horaire se produiront, cela devrait résoudre votre problème.Conclusion - Je pense que spécialement à cette fin, vous devriez utiliser une bibliothèque de dates comme moment-fuseau horaire .
la source
*60*60
devrait plutôt l'être*60000
, car getTime est en millisecondes et getTimezoneOffset est en minutes, dont 60000 millisecondes dans une minute, pas 60 * 60 == 3600Pour prendre en compte les millisecondes et le fuseau horaire de l'utilisateur, utilisez ce qui suit:
la source
Juste une autre approche
À votre santé!
la source
new Date().getTimezoneOffset()
devrait être remplacé parnew Date(timestampStr).getTimezoneOffset()
Je soupçonne que la réponse ne donne pas le résultat correct. Dans la question, le demandeur souhaite convertir l'horodatage du serveur en heure actuelle à Hellsinki sans tenir compte du fuseau horaire actuel de l'utilisateur.
C'est le fait que le fuseau horaire de l'utilisateur peut être ce que jamais nous ne pouvons pas lui faire confiance.
Si par exemple. l'horodatage est 1270544790922 et nous avons une fonction:
Lorsqu'un New-Yorkais visite la page, l'alerte (_helsenkiTime) s'imprime:
Et lorsqu'un Finlandais visite la page, l'alerte (_helsenkiTime) s'imprime:
Ainsi, la fonction n'est correcte que si le visiteur de la page a le fuseau horaire cible (Europe / Helsinki) dans son ordinateur, mais échoue dans presque toutes les autres parties du monde. Et comme l'horodatage du serveur est généralement un horodatage UNIX, qui est par définition en UTC, le nombre de secondes depuis l'époque Unix (1er janvier 1970 00:00:00 GMT), nous ne pouvons pas déterminer l'heure d'été ou non à partir de l'horodatage.
La solution consiste donc à ignorer le fuseau horaire actuel de l'utilisateur et à implémenter un moyen de calculer le décalage UTC, que la date soit à l'heure d'été ou non. Javascript n'a pas de méthode native pour déterminer l'historique de transition DST d'un autre fuseau horaire que le fuseau horaire actuel de l'utilisateur. Nous pouvons y parvenir le plus simplement en utilisant un script côté serveur, car nous avons un accès facile à la base de données des fuseaux horaires du serveur avec l'historique complet des transitions de tous les fuseaux horaires.
Mais si vous n'avez pas accès à la base de données de fuseaux horaires du serveur (ou de tout autre serveur) ET que l'horodatage est en UTC, vous pouvez obtenir la fonctionnalité similaire en codant en dur les règles DST en Javascript.
Pour couvrir les dates des années 1998 à 2099 en Europe / Helsinki, vous pouvez utiliser la fonction suivante ( jsfiddled ):
Exemples d'utilisation:
Et cela imprime ce qui suit quel que soit le fuseau horaire de l'utilisateur:
Bien sûr, si vous pouvez renvoyer l'horodatage sous une forme que le décalage (DST ou non DST) est déjà ajouté à l'horodatage sur le serveur, vous n'avez pas à le calculer côté client et vous pouvez simplifier beaucoup la fonction. MAIS rappelez-vous de NE PAS utiliser timezoneOffset (), car vous devez alors gérer le fuseau horaire de l'utilisateur et ce n'est pas le comportement souhaité.
la source
En supposant que vous obtenez l'horodatage à l'heure d'Helsinki, je créerais un objet de date réglé sur minuit le 1er janvier 1970 UTC (pour ne pas tenir compte des paramètres de fuseau horaire local du navigateur). Ensuite, ajoutez simplement le nombre de millisecondes nécessaire.
Attention plus tard, à toujours demander les valeurs UTC à l'objet date. De cette façon, les utilisateurs verront les mêmes valeurs de date indépendamment des paramètres locaux. Sinon, les valeurs de date seront décalées en fonction des paramètres d'heure locale.
la source
Vous pourriez utiliser
setUTCMilliseconds()
la source
setUTCMilliseconds()
méthode définit les millisecondes pour une date spécifiée en fonction du temps universel. [...] Si un paramètre que vous spécifiez est en dehors de la plage attendue,setUTCMilliseconds()
tente de mettre à jour les informations de date dans l'objet Date en conséquence. En d'autres termes, vous créez unDate
objet ayant l'horodatage Unix donné, à UTC.