Existe-t-il un moyen standard pour un serveur Web de déterminer le fuseau horaire d'un utilisateur dans une page Web?
Peut-être à partir d'un en-tête HTTP ou d'une partie de la user-agent
chaîne?
html
browser
timezone
user-agent
timezone-offset
Kevin Dente
la source
la source
Réponses:
La méthode
getTimezoneOffset()
soustraira votre temps de GMT et renverra le nombre de minutes. Donc, si vous vivez en GMT-8, il retournera 480.Pour mettre cela en heures, divisez par 60. Notez également que le signe est l'opposé de ce dont vous avez besoin - il calcule le décalage GMT à partir de votre fuseau horaire, et non le décalage de votre fuseau horaire à partir de GMT. Pour résoudre ce problème, multipliez simplement par -1.
Notez également que w3school dit:
la source
>>> date.toTimeString() "15:46:04 GMT+1200 (New Zealand Standard Time)"
La façon la plus populaire (== standard?) De déterminer le fuseau horaire que j'ai vu est de simplement demander aux utilisateurs eux-mêmes. Si votre site Web nécessite un abonnement, cela pourrait être enregistré dans les données de profil des utilisateurs. Pour les utilisateurs anon, les dates peuvent être affichées en UTC ou GMT ou certains autres.
Je n'essaie pas d'être un aleck intelligent. C'est juste que parfois certains problèmes ont des solutions plus fines en dehors de tout contexte de programmation.
la source
Il n'y a aucun en-tête HTTP qui rapportera le fuseau horaire des clients jusqu'à présent, bien qu'il ait été suggéré de l'inclure dans la spécification HTTP.
Si c'était moi, j'essaierais probablement de récupérer le fuseau horaire en utilisant JavaScript côté client, puis de le soumettre au serveur en utilisant Ajax ou quelque chose.
la source
JavaScript est le moyen le plus simple d'obtenir l'heure locale du client. Je suggère d'utiliser un XMLHttpRequest pour renvoyer l'heure locale, et si cela échoue, revenir au fuseau horaire détecté en fonction de leur adresse IP.
En ce qui concerne la géolocalisation, j'ai utilisé MaxMind GeoIP sur plusieurs projets et cela fonctionne bien, même si je ne sais pas s'ils fournissent des données de fuseau horaire. C'est un service que vous payez et ils fournissent des mises à jour mensuelles à votre base de données. Ils fournissent des wrappers dans plusieurs langues Web.
la source
Tout d'abord, comprenez que la détection de fuseau horaire en JavaScript est imparfaite. Vous pouvez obtenir la locale décalage de fuseau horaire pour une date et une heure à l' aide
getTimezoneOffset
d'une instance de l'Date
objet, mais ce n'est pas tout à fait identique à une pleine zone de temps IANA commeAmerica/Los_Angeles
.Certaines options peuvent cependant fonctionner:
Le résultat est une chaîne contenant le paramètre de fuseau horaire IANA de l'ordinateur sur lequel le code s'exécute.
Les environnements pris en charge sont répertoriés dans le tableau de compatibilité Intl . Développez la
DateTimeFormat
section et examinez la fonction nomméeresolvedOptions().timeZone defaults to the host environment
.Certaines bibliothèques, telles que Luxon, utilisent cette API pour déterminer le fuseau horaire via des fonctions comme
luxon.Settings.defaultZoneName
.Intl
API si elle est disponible, et quand elle n'est pas disponible, ils interrogent lagetTimezoneOffset
fonction de l'Date
objet, pour plusieurs points différents dans le temps, en utilisant les résultats pour choisir un fuseau horaire approprié dans un ensemble de données internes.Les deux jsTimezoneDetect et moment de -fuseau horaire ont cette fonctionnalité.
Dans les deux cas, le résultat ne peut être considéré que comme une supposition. La supposition peut être correcte dans de nombreux cas, mais pas tous.
De plus, ces bibliothèques doivent être périodiquement mises à jour pour contrer le fait que de nombreuses implémentations JavaScript plus anciennes ne connaissent que la règle d'heure d'été actuelle pour leur fuseau horaire local. Plus de détails à ce sujet ici.
En fin de compte, une meilleure approche consiste à demander à votre utilisateur son fuseau horaire. Fournissez un paramètre qu'ils peuvent modifier. Vous pouvez utiliser l'une des options ci-dessus pour choisir un paramètre par défaut , mais ne rendez pas impossible de s'en écarter dans votre application.
Il y a aussi l'approche complètement différente de ne pas s'appuyer du tout sur le réglage du fuseau horaire de l'ordinateur de l'utilisateur. Au lieu de cela, si vous pouvez recueillir des coordonnées de latitude et de longitude, vous pouvez les résoudre en un fuseau horaire à l'aide de l' une de ces méthodes . Cela fonctionne bien sur les appareils mobiles.
la source
Voici une solution JavaScript robuste pour déterminer le fuseau horaire dans lequel se trouve le navigateur.
https://bitbucket.org/pellepim/jstimezonedetect
Annexe 1: Maintenant, ce projet est situé sur GitHub: https://github.com/pellepim/jstimezonedetect
la source
Voici une manière plus complète.
Un extrait est ci-dessous:
Obtenir TZ et DST de JS (via Way Back Machine)
la source
Africa/Johannesburg
ouEurope/Istanbul
. Voir le wiki des balises de fuseau horaire .En utilisant l'approche d'Unkwntech, j'ai écrit une fonction utilisant jQuery et PHP. Ceci est testé et fonctionne!
Sur la page PHP où vous souhaitez avoir le fuseau horaire en tant que variable, ayez cet extrait de code quelque part vers le haut de la page:
Cela lira la variable de session "time", que nous sommes sur le point de créer.
Sur la même page, dans <head>, vous devez tout d'abord inclure jQuery:
Toujours dans <head>, sous jQuery, collez ceci:
Vous l'avez peut-être remarqué ou non, mais vous devez modifier l'URL de votre domaine réel.
Une dernière chose. Vous vous demandez probablement ce qu'est le timezone.php. Eh bien, c'est simplement ceci: (créez un nouveau fichier appelé timezone.php et pointez-le avec l'URL ci-dessus)
Si cela fonctionne correctement, il chargera d'abord la page, exécutera le JavaScript et rechargera la page. Vous pourrez alors lire la variable $ timezone et l'utiliser à votre guise! Il renvoie le décalage de fuseau horaire UTC / GMT actuel (GMT -7) ou le fuseau horaire dans lequel vous vous trouvez.
la source
Pour soumettre le décalage de fuseau horaire en tant qu'en-tête HTTP sur les requêtes AJAX avec jQuery
Vous pouvez également faire quelque chose de similaire pour obtenir le nom réel du fuseau horaire à l'aide
moment.tz.guess();
de http://momentjs.com/timezone/docs/#/using-timezones/guessing-user-timezone/la source
Je n'ai toujours pas vu de réponse détaillée ici qui indique le fuseau horaire. Vous ne devriez pas avoir besoin de géocoder par adresse IP ou d'utiliser PHP (lol) ou de deviner incorrectement à partir d'un décalage.
Premièrement, un fuseau horaire n'est pas seulement un décalage par rapport à GMT. C'est une zone de terre dans laquelle les règles de temps sont fixées par des normes locales. Certains pays ont l'heure d'été et activeront l'heure d'été à différents moments. Il est généralement important d'obtenir la zone réelle, pas seulement le décalage actuel.
Si vous avez l'intention de stocker ce fuseau horaire, par exemple dans les préférences de l'utilisateur, vous voulez la zone et pas seulement le décalage. Pour les conversions en temps réel, cela n'aura pas beaucoup d'importance.
Maintenant, pour obtenir le fuseau horaire avec javascript, vous pouvez utiliser ceci:
Cependant, j'ai trouvé plus facile d'utiliser simplement ce plugin robuste qui renvoie le fuseau horaire au format Olsen:
https://github.com/scottwater/jquery.detect_timezone
la source
Avec la
date
fonction PHP , vous obtiendrez la date et l'heure du serveur sur lequel se trouve le site. La seule façon d'obtenir le temps de l'utilisateur est d'utiliser JavaScript.Mais je vous suggère de le faire, si votre site nécessite une inscription, alors le meilleur moyen est de demander à l'utilisateur tout en ayant l'inscription comme champ obligatoire. Vous pouvez lister différents fuseaux horaires sur la page d'enregistrement et les enregistrer dans la base de données. Après cela, si l'utilisateur se connecte au site, vous pouvez définir le fuseau horaire par défaut pour cette session selon le fuseau horaire sélectionné par l'utilisateur.
Vous pouvez définir n'importe quel fuseau horaire spécifique à l'aide de la fonction PHP
date_default_timezone_set
. Cela définit le fuseau horaire spécifié pour les utilisateurs.Fondamentalement, le fuseau horaire des utilisateurs est côté client, nous devons donc utiliser JavaScript pour cela.
Ci-dessous est le script pour obtenir le fuseau horaire des utilisateurs en utilisant PHP et JavaScript.
Mais selon mon point de vue, il vaut mieux demander aux utilisateurs si l'inscription est obligatoire dans votre projet.
la source
N'utilisez pas l'adresse IP pour déterminer définitivement l'emplacement (et donc le fuseau horaire) - c'est parce qu'avec le NAT, les proxys (de plus en plus populaires) et les VPN, les adresses IP ne reflètent pas nécessairement de manière réaliste l'emplacement réel de l'utilisateur, mais l'emplacement auquel le les serveurs implémentant ces protocoles résident.
Similaire à la façon dont les indicatifs régionaux américains ne sont plus utiles pour localiser un utilisateur de téléphone, étant donné la popularité de la portabilité des numéros.
L'adresse IP et les autres techniques indiquées ci-dessus sont utiles pour suggérer une valeur par défaut que l'utilisateur peut ajuster / corriger.
la source
JavaScript:
Fournissez simplement vos heures au format d'horodatage Unix à cette fonction; JavaScript connaît déjà le fuseau horaire de l'utilisateur.
Comme ça:
PHP:
Cela affichera toujours les heures correctement en fonction du fuseau horaire que la personne a défini sur l'horloge de son ordinateur. Il n'est pas nécessaire de demander quoi que ce soit à personne et de l'enregistrer dans des endroits, Dieu merci!
la source
Facile, utilisez simplement la
getTimezoneOffset
fonction JavaScript comme ceci:la source
La magie semble être
C'est cool, je ne savais pas ça. Cela fonctionne-t-il dans Internet Explorer, etc.? De là, vous devriez pouvoir utiliser JavaScript pour Ajax, définir des cookies, peu importe. J'irais probablement dans la voie des cookies moi-même.
Vous devrez cependant autoriser l'utilisateur à le modifier. Nous avons essayé d'utiliser la géolocalisation (via maxmind) pour le faire il y a un certain temps, et cela était assez souvent incorrect - suffisamment pour que cela ne vaille pas la peine, alors nous laissons simplement l'utilisateur le définir dans son profil et afficher un avis aux utilisateurs qui n'ont pas encore défini le leur.
la source
Voici un article (avec le code source) qui explique comment déterminer et utiliser l'heure localisée dans une application ASP.NET (VB.NET, C #):
Il est temps
En bref, l'approche décrite repose sur la
getTimezoneOffset
fonction JavaScript , qui renvoie la valeur qui est enregistrée dans le cookie de session et utilisée par code-behind pour ajuster les valeurs de temps entre GMT et l'heure locale. La bonne chose est que l'utilisateur n'a pas besoin de spécifier le fuseau horaire (le code le fait automatiquement). Il y a plus d'implication (c'est pourquoi je fais un lien vers l'article), mais le code fourni le rend vraiment facile à utiliser. Je soupçonne que vous pouvez convertir la logique en PHP et dans d'autres langages (tant que vous comprenez ASP.NET).la source
Si vous utilisez OpenID pour l'authentification, l' extension d'enregistrement simple résoudrait le problème pour les utilisateurs authentifiés (vous devrez convertir de tz en numérique).
Une autre option consisterait à déduire le fuseau horaire de la préférence de pays de l'agent utilisateur. C'est une méthode quelque peu grossière (ne fonctionnera pas pour en-US), mais fait une bonne approximation.
la source
C'est simple avec JavaScript et PHP:
Même si l'utilisateur peut jouer avec son horloge interne et / ou son fuseau horaire, le meilleur moyen que j'ai trouvé jusqu'à présent pour obtenir le décalage reste
new Date().getTimezoneOffset();
. Il est non invasif, ne donne pas de maux de tête et élimine le besoin de s'appuyer sur des tiers.Disons que j'ai une table,,
users
qui contient un champdate_created int(13)
, pour stocker les horodatages Unix;En supposant un client
creates a new account
, les données sont reçues parpost
, et je doisinsert/update
ledate_created column
avec l'horodatage Unix du client, pas celui du serveur.Étant donné que timezoneOffset est nécessaire au moment de l'insertion / mise à jour, il est transmis en tant qu'élément $ _POST supplémentaire lorsque le client soumet le formulaire, éliminant ainsi la nécessité de le stocker dans des sessions et / ou des cookies, et aucun serveur supplémentaire n'apparaît non plus.
Dites que le serveur reçoit en
tzo
tant que$_POST['tzo']
;Insérer / mettre à jour
date_created=$user_timestamp
.Lors de la récupération de la date_created, vous pouvez convertir l'horodatage comme suit:
Maintenant, cet exemple peut répondre à vos besoins, quand il s'agit d'insérer un
first
horodatage ... Lorsqu'il s'agit d'un horodatage ou d'une table supplémentaire, vous pouvez envisager d'insérer la valeur tzo dans la table des utilisateurs pour référence future, ou de la définir en session ou en cookie.PS MAIS que faire si l'utilisateur voyage et change de fuseau horaire. Se connecte à GMT + 4, se déplace rapidement vers GMT-1 et se reconnecte. La dernière connexion serait dans le futur.
Je pense ... nous pensons trop.
la source
Vous pouvez le faire sur le client avec le fuseau horaire et envoyer la valeur au serveur; exemple d'utilisation:
la source
Obtenir un nom de fuseau horaire valide pour la base de données TZ en PHP est un processus en deux étapes:
Avec JavaScript, obtenez un décalage de fuseau horaire en quelques minutes
getTimezoneOffset
. Ce décalage sera positif si le fuseau horaire local est derrière UTC et négatif s'il est devant. Vous devez donc ajouter un signe opposé au décalage.Passez ce décalage à PHP.
En PHP, convertissez ce décalage en un nom de fuseau horaire valide avec la fonction timezone_name_from_abbr .
J'ai écrit un article de blog à ce sujet: Comment détecter le fuseau horaire de l'utilisateur en PHP . Il contient également une démo.
la source
Intl.DateTimeFormat().resolvedOptions().timeZone
et à l'envoyer au serveur Web. Ref: stackoverflow.com/questions/9772955/…Un moyen simple de le faire est d'utiliser:
la source
Une option possible consiste à utiliser le
Date
champ d'en-tête, qui est défini dans la RFC 7231 et est censé inclure le fuseau horaire. Bien sûr, il n'est pas garanti que la valeur soit vraiment le fuseau horaire du client, mais cela peut être un point de départ pratique.la source
Voici comment je le fais. Cela définira le fuseau horaire par défaut de PHP sur le fuseau horaire local de l'utilisateur. Collez simplement ce qui suit en haut de toutes vos pages:
la source
Essayez ce code PHP:
la source