Je souhaite que le serveur affiche toujours les dates en UTC dans le HTML et que JavaScript sur le site client le convertisse dans le fuseau horaire local de l'utilisateur.
Bonus si je peux produire dans le format de date locale de l'utilisateur.
Je souhaite que le serveur affiche toujours les dates en UTC dans le HTML et que JavaScript sur le site client le convertisse dans le fuseau horaire local de l'utilisateur.
Bonus si je peux produire dans le format de date locale de l'utilisateur.
Il semble que le moyen le plus infaillible de commencer avec une date UTC est de créer un nouvel Date
objet et d'utiliser les setUTC…
méthodes pour le définir à la date / heure souhaitée.
Ensuite, les différentes toLocale…String
méthodes fourniront une sortie localisée.
// This would come from the server.
// Also, this whole block could probably be made into an mktime function.
// All very bare here for quick grasping.
d = new Date();
d.setUTCFullYear(2004);
d.setUTCMonth(1);
d.setUTCDate(29);
d.setUTCHours(2);
d.setUTCMinutes(45);
d.setUTCSeconds(26);
console.log(d); // -> Sat Feb 28 2004 23:45:26 GMT-0300 (BRT)
console.log(d.toLocaleString()); // -> Sat Feb 28 23:45:26 2004
console.log(d.toLocaleDateString()); // -> 02/28/2004
console.log(d.toLocaleTimeString()); // -> 23:45:26
toLocateDateString()
renvoie quelque chose qui ressemble à «dimanche 12 janvier 2014».var d = new Date(Date.UTC(2004,1,29,2,45,26));
toLocaleString()
fonctions.Pour les nouveaux projets, utilisez simplement moment.js
Cette question est assez ancienne, donc moment.js n'existait pas à ce moment-là, mais pour les nouveaux projets, cela simplifie beaucoup des tâches comme celle-ci.
Il est préférable d' analyser votre chaîne de date à partir de UTC comme suit (créez une chaîne compatible ISO-8601 sur le serveur pour obtenir des résultats cohérents sur tous les navigateurs):
Maintenant, utilisez simplement
m
dans votre application, moment.js utilise par défaut le fuseau horaire local pour les opérations d'affichage. Il existe de nombreuses façons de mettre en forme les valeurs de date et d'heure ou d'en extraire des parties.Vous pouvez même formater un objet moment dans les paramètres régionaux de l'utilisateur comme ceci:
Pour transformer un objet moment.js en un fuseau horaire différent (c'est-à-dire ni le fuseau horaire local ni UTC), vous aurez besoin de l' extension de fuseau horaire moment.js . Cette page a aussi quelques exemples, c'est assez simple à utiliser.
la source
For old projects, just use jQuery
Vous pouvez utiliser
new Date().getTimezoneOffset()/60
pour le fuseau horaire. Il existe également unetoLocaleString()
méthode pour afficher une date en utilisant les paramètres régionaux de l'utilisateur.Voici la liste complète: Travailler avec des dates
la source
toLocaleString
?Une fois que vous avez construit votre objet de date, voici un extrait de code pour la conversion:
La fonction prend un objet Date au format UTC et une chaîne de format.
Vous aurez besoin d'un
Date.strftime
prototype.la source
getTimezoneOffset()/60
peut renvoyer une fraction (par exemple, un décalage de l'Inde de +05: 30 renverra 5,5). Les décimales sont tronquées. Sinon, le réglage des heures met à jour les autres valeurs (définissez les heures sur 48 et voyez ce qui se passe).Dans JS, il n'y a pas de moyen simple et multiplateforme pour formater l'heure locale, en dehors de la conversion de chaque propriété comme mentionné ci-dessus.
Voici un hack rapide que j'utilise pour obtenir le YYYY-MM-DD local. Notez qu'il s'agit d'un hack, car la date finale n'aura plus le fuseau horaire correct (vous devez donc ignorer le fuseau horaire). Si j'ai besoin d'autre chose, j'utilise moment.js.
Le d.getTimezoneOffset () renvoie le décalage du fuseau horaire en minutes, et le d.getTime () est en ms, d'où le x 60 000.
la source
Voici ce que j'ai utilisé dans les projets précédents:
la source
getTimezoneOffset()/60
renverront donc souvent une valeur décimale. Cela est particulièrement vrai pour les dates antérieures à 1900, où de nombreux endroits avaient des décalages en minutes et secondes. De plus, les dates javascript sont désormais requises pour prendre en charge les décalages historiques. Par exemple, en 1890, le décalage à Moscou était de +2: 30: 17. Voir Navigateurs, fuseaux horaires, erreur Chrome 67 .le
.getTimezoneOffset()
méthode rapporte le décalage du fuseau horaire en minutes, en comptant "vers l'ouest" à partir du fuseau horaire GMT / UTC, ce qui entraîne une valeur de décalage négative par rapport à ce à quoi on est habitué. (Par exemple, l'heure de New York serait de +240 minutes ou +4 heures)Pour obtenir un décalage de fuseau horaire normal en heures, vous devez utiliser:
Détail important:
notez que l'heure d'été est prise en compte dans le résultat - donc ce que cette méthode vous donne est vraiment le décalage horaire - et non le décalage horaire géographique réel .
la source
Avec la date du code PHP, j'ai utilisé quelque chose comme ça.
On peut l'appeler comme ça
la source
Jusqu'à présent, je mélange les réponses et j'y ajoute, car je devais les lire toutes et enquêter en plus pendant un certain temps pour afficher une chaîne de date et d'heure de db dans le format de fuseau horaire local d'un utilisateur.
La chaîne datetime provient d'une base de données python / django au format: 2016-12-05T15: 12: 24.215Z
La détection fiable de la langue du navigateur dans JavaScript ne semble pas fonctionner dans tous les navigateurs (voir JavaScript pour détecter la préférence de langue du navigateur ), donc j'obtiens la langue du navigateur du serveur.
Python / Django: envoyer le langage du navigateur de requête comme paramètre de contexte:
HTML: écrivez-le dans une entrée masquée:
JavaScript: obtenir la valeur de l'entrée cachée, par exemple en-GB, en-US; q = 0.8, en; q = 0.6 / puis prendre la première langue de la liste uniquement via replace et expression régulière
JavaScript: convertir en datetime et le formater:
Voir: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleDateString
Le résultat est (la langue du navigateur est en-gb): 05/12/2016, 14:58
la source
la source
options
pièce pour mon cas)La meilleure solution que j'ai rencontrée est de créer des balises [time display = "llll" datetime = "UTC TIME" /] et d'utiliser javascript (jquery) pour les analyser et les afficher par rapport à l'heure de l'utilisateur.
http://momentjs.com/ Moment.js
affichera bien l'heure.
la source
Vous pouvez utiliser ce qui suit, qui indique le décalage du fuseau horaire par rapport à GMT en quelques minutes:
Remarque: - cette fonction renvoie un nombre négatif.
la source
getTimeZoneOffset () et toLocaleString sont parfaits pour le travail de base sur les dates, mais si vous avez besoin d'un support de fuseau horaire réel, regardez TimeZone.js de mde .
Il y a quelques autres options discutées dans la réponse à cette question
la source
Pour convertir une date en date locale, utilisez la méthode toLocaleDateString ().
Pour convertir l'heure en heure locale, utilisez la méthode toLocaleTimeString ().
la source
Je ne sais pas comment utiliser les paramètres régionaux, mais javascript est une technologie côté client.
aura l'heure et la date du client (comme indiqué par son navigateur, et par extension l'ordinateur sur lequel il est assis). Il devrait être simple d'inclure l'heure du serveur dans la réponse et de faire quelques calculs simples pour deviner le décalage temporel.
la source