Déterminer un utilisateur fuseau horaire
Est-il un moyen standard pour un serveur web pour être en mesure de déterminer le fuseau horaire de l'utilisateur sur une page web?
Peut-être à partir d'un en-tête HTTP ou partie de la user-agent
chaîne?
Demander à l'utilisateur. Si vous obtenez le fuseau horaire de l'ordinateur de l'utilisateur, et il est mal réglé, alors quoi?
Ensuite, l'utilisateur n'a probablement pas de soins?
Entendez-vous stackoverflow.com/q/1091372/218196 ?
Malheureusement, les réponses à cette question permettent également l'utilisateur de profilage et de geofencing.
Pourquoi avez-vous besoin de connaître le fuseau horaire?
Ensuite, l'utilisateur n'a probablement pas de soins?
Entendez-vous stackoverflow.com/q/1091372/218196 ?
Malheureusement, les réponses à cette question permettent également l'utilisateur de profilage et de geofencing.
Pourquoi avez-vous besoin de connaître le fuseau horaire?
OriginalL'auteur Kevin Dente | 2008-08-01
Vous devez vous connecter pour publier un commentaire.
La méthode
getTimezoneOffset()
se soustraire votre temps de GMT et de retourner le nombre de minutes. Donc, si vous vivre dans GMT-8, il sera de retour 480.De mettre cela en heures, diviser par 60. Aussi, notez que le signe est le contraire de ce que vous avez besoin - c'est le calcul de l'heure GMT du décalage à partir de votre fuseau horaire, pas le temps de la zone de décalage de l'heure GMT. Pour résoudre ce problème, il suffit de multiplier par -1.
Également noter que w3school dit:
Ce n'est pas pour l'heure d'été. Obtenir le décalage horaire fait exactement ce qu'il dit. C'est le décalage. Un fuseau HORAIRE est en fait une zone géographique. Cela ne fonctionne pas pour l'heure d'été car vous ne savez pas quel est l'hémisphère de l'utilisateur, ou si leur pays a même de l'heure d'été. Pourquoi ne pas utiliser ce lieu:
>>> date.toTimeString() "15:46:04 GMT+1200 (New Zealand Standard Time)"
Je prie de différer avec Keyo. La définition de getTimezoneOffset() (selon la norme ECMA ecma-international.org/ecma-262/5.1/#sec-15.9.5.26) "Renvoie la différence entre l'heure locale et l'heure UTC en quelques minutes." - en d'autres termes, il devrait prendre de l'heure d'été en compte. Mozilla documentation dit "l'heure d'été empêche cette valeur étant une constante, même pour un endroit donné."
Il obtient de l'utilisateur décalage de GMT. C'est très bien si vous êtes à la présentation d'un autre temps qui se produit le jour même (sauf si la date actuelle est une date de basculement, où elle peut être fausse). Cependant, il existe de nombreux fuseaux horaires qui ont le même décalage par rapport à l'heure GMT, et ils peuvent avoir différentes dates de basculement ou de ne pas utiliser l'heure d'été.
Une chose à noter ici; certains endroits (comme à terre-Neuve au Canada) ont fuseaux horaires qui sont décalés d'une demi-heure, après division par 60 votre réponse ne peut pas être un nombre entier.
OriginalL'auteur JD Isaacks
Les plus populaires (=- =de série?) façon de déterminer le fuseau horaire j'ai vu autour de est tout simplement de demander aux utilisateurs eux-mêmes. Si votre site nécessite un abonnement, ce qui pouvait être sauvé dans le profil des utilisateurs de données. Pour anon utilisateurs, les dates peuvent être affichées en heure UTC ou GMT ou quelque chose du genre.
Je n'essaie pas d'être un smart aleck. C'est juste que parfois certains problèmes avoir plus de solutions en dehors de tout contexte de programmation.
mais les utilisateurs de faire des voyages à l'étranger et ils ne devrais pas le besoin de raconter leur fuseau horaire à chaque fois qu'ils la connexion d'un non-natif fuseau horaire
Cela ne veut pas répondre à la question, ce qui implique clairement qu'il est à la recherche d'une solution technologique.
L'OP est en demande d'une solution standard. C'est assez standard.
La meilleure solution serait probablement d'une combinaison de la demande de l'utilisateur (par exemple, pour fournir un temps de la zone de liste déroulante en haut d'un rapport), tout défaut de la liste déroulante de sélection d'un GPS-un temps déterminé de la zone lorsque l'utilisateur est sur un appareil mobile qui fournit des informations de localisation, et sinon par défaut à l'UTC.
OriginalL'auteur Ishmaeel
Il n'y a pas d'en-têtes HTTP qui fera rapport sur les clients fuseau horaire jusqu'à présent mais il a été suggéré d'inclure dans la spécification HTTP.
Si c'était moi, je serais probablement essayer de récupérer le fuseau horaire à l'aide de JavaScript côté client et de le soumettre ensuite au serveur à l'aide d'Ajax ou de quelque chose.
Je crois que la meilleure méthode est d'utiliser la géo-localisation par ip pour trier les délais zones et par défaut, choisissez le premier qui est (à proximité) correspondent à l'agent utilisateur décalage de temps (JavaScript nécessaire). Même après cela, vous devez fournir un moyen pour régler le fuseau horaire, même après cette méthode, sélectionnez celui incorrect.
attention lors de l'utilisation de proxys, comme ils n'ont pas toujours se faire de la publicité dans les en-têtes.
il existe une meilleure réponse aujourd'hui: stackoverflow.com/a/11836123/334451
OriginalL'auteur Mads Kristiansen
JavaScript est le moyen le plus facile d'obtenir du client, heure locale. Je voudrais suggérer à l'aide d'un XMLHttpRequest à renvoyer l'heure locale, et si cela échoue, revenir à la timezone détectés en fonction de leur adresse IP.
Autant que la géolocalisation, j'ai utilisé MaxMind GeoIP sur plusieurs projets et il fonctionne bien, même si je ne suis pas sûr si elles fournissent des données de fuseau horaire. C'est un service que vous payez pour et ils fournissent des mises à jour mensuelles de votre base de données. Ils fournissent des wrappers dans plusieurs langages web.
Voir aussi question.
Les versions actuelles (gratuites et payantes) de la MaxMind GeoIP des bases de données ou Api, de faire en effet fournir des informations de fuseau horaire (il retourne "Europe/London" pour mon fuseau horaire.) Je ne me souviens pas si l'ancienne version de leur GeoIP système a fait de même, mais il fonctionne très bien maintenant! Le MaxMind champs sont nommés "time_zone", "time_zone_name".
OriginalL'auteur pix0r
Ici est une robuste solution d'activer JavaScript pour déterminer le fuseau horaire, le navigateur est en.
https://bitbucket.org/pellepim/jstimezonedetect
Ce! C'est le chemin à parcourir. Simple bibliothèque, les poignées de l'heure d'été correctement. D'autres réponses sont plein de WTF et de nombreuses ne pas faire de l'heure d'été.
Cette bibliothèque est très intelligent. Il fonctionne en interrogeant le décalage actuel à l'UTC, puis en ajustant JavaScript objet Date du temps en ajoutant ou en soustrayant secondes jusqu'à ce décalage UTC changements. En utilisant cette méthode, cette bibliothèque en chiffres nombre de suffisamment de modifications de l'heure d'été à identifier de manière unique le fuseau horaire. Je pense que la bibliothèque pourrait avoir de meilleures performances, même si elle n'binaire de recherche à la place de la recherche linéaire. La valeur de retour est une IANA zone info clé (aka le Olson fuseau horaire de base de données).
Cette bibliothèque n'est plus nécessaire. Les navigateurs modernes de soutien à l'International de l'API, qui renvoie l'IANA fuseau horaire de la chaîne. Voir cette réponse.
OriginalL'auteur Adam
Ici est de façon plus complète.
Un extrait est ci-dessous:
L'obtention de TZ et de l'heure d'été à partir de JS (par Machine)
Ce ne sera qu'un retour de la offset standard pour le fuseau horaire, comme la +02:00. Il ne sera pas vous donner assez d'informations pour déterminer le fuseau horaire de l'utilisateur, tels que
Africa/Johannesburg
ouEurope/Istanbul
. Voir le fuseau horaire balise wiki.OriginalL'auteur Joseph Lust
Tout d'abord, comprendre que le temps de la zone de détection en JavaScript est imparfaite. Vous pouvez obtenir le local décalage horaire pour une date et une heure précises à l'aide de
getTimezoneOffset
sur une instance de laDate
objet, mais ce n'est pas tout à fait la même chose qu'un plein IANA fuseau horaire commeAmerica/Los_Angeles
.Il y a quelques options qui peuvent fonctionner bien:
La plupart des navigateurs modernes soutien de l'IANA fuseaux horaires dans leur mise en œuvre de la ECMAScript l'Internationalisation de l'API, de sorte que vous pouvez le faire:
Le résultat est une chaîne de caractères contenant l'IANA réglage du fuseau horaire de l'ordinateur où le code est en cours d'exécution.
Environnements pris en charge sont répertoriés dans le Intl tableau de compatibilité. Développez le
DateTimeFormat
section, et de regarder la fonctionnalité nomméeresolvedOptions().timeZone defaults to the host environment
.luxon.Settings.defaultZoneName
.Si vous avez besoin de l'appui d'un ensemble plus large d'environnements, tels que les anciens navigateurs web, vous pouvez utiliser une bibliothèque pour faire une conjecture instruite à l'heure de la zone. Ils travaillent en essayant d'abord la
Intl
API si elle est disponible, et quand il n'est pas disponible, ils interrogent legetTimezoneOffset
fonction de laDate
objet, pour plusieurs points différents dans le temps, en utilisant les résultats de choisir un fuseau horaire à partir de l'intérieur de l'ensemble de données.Les deux jsTimezoneDetect et moment-timezone avoir cette fonctionnalité.
Dans les deux cas, le résultat ne peut être considéré comme une supposition. Le devinez peut-être raison, dans de nombreux cas, mais pas tous d'entre eux.
En outre, ces bibliothèques doivent être mis à jour périodiquement afin de contrer le fait que de nombreux anciens JavaScript implémentations ne sont au courant de la actuel de l'heure d'été la règle pour le fuseau horaire local. Plus de détails à ce sujet ici.
En fin de compte, une meilleure approche est de demander à votre utilisateur pour leur fuseau horaire. Fournir un paramètre qu'ils peuvent changer. Vous pouvez utiliser l'une des options ci-dessus pour en choisir un par défaut paramètre, mais n'en faites pas il est impossible de déroger dans votre application.
Il y a aussi l'approche totalement différente de pas en s'appuyant sur le paramètre de fuseau horaire de l'ordinateur de l'utilisateur. Au lieu de cela, si vous pouvez rassembler des coordonnées de latitude et longitude, vous pouvez résoudre ceux d'un fuseau horaire à l'aide de l'une de ces méthodes. Cela fonctionne bien sur les appareils mobiles.
OriginalL'auteur Matt Johnson
À l'aide de Unkwntech approche, j'ai écrit une fonction à l'aide de jQuery et PHP. C'est testé et fonctionne!
Sur la page PHP où vous voulez avoir le fuseau horaire variable, cet extrait de code quelque part près de la haut de la page:
Cela permettra de lire la variable de session "temps", nous sommes maintenant sur le point de créer.
Sur la même page, dans le <head>, vous devez tout d'abord inclure jQuery:
Également dans le <head>, en dessous de jQuery, collez ceci:
Vous peut ou peut ne pas avoir remarqué, mais vous avez besoin de changer l'URL de votre domaine.
Une dernière chose. Vous vous demandez probablement ce que le diable timezone.php est. Eh bien, c'est simplement ceci:
(créer un nouveau fichier appelé timezone.php et point avec l'URL ci-dessus)
Si cela fonctionne correctement, il sera le premier chargement de la page, exécuter le JavaScript, et de recharger la page. Vous serez alors en mesure de lire les $fuseau horaire variable et de l'utiliser pour votre plus grand plaisir! Il renvoie en cours UTC/GMT décalage de fuseau horaire (GMT -7) ou quel que soit le fuseau horaire où vous vous trouvez.
Il est probablement plus facile d'utiliser un Cookie de Session pour le transport de ce, depuis de verrouillage et de désérialisation la session PHP peut provoquer des ralentissements dans votre application. Pour un maximum d'efficacité, vous pouvez copier la valeur dans la session et supprimer le cookie de sorte qu'il n'est pas envoyé dans les demandes ultérieures.
OriginalL'auteur Westy92
Je n'ai pas encore vu une réponse détaillée ici qui obtient le fuseau horaire. Vous ne devriez pas avoir besoin de géocoder une adresse IP ou utiliser PHP (lol) ou mal deviner à partir d'un offset.
Tout d'abord un fuseau horaire n'est pas seulement un décalage de l'heure GMT. C'est un territoire dans lequel le temps, les règles sont définies par les normes locales. Certains pays ont de l'heure d'été, et passera à l'heure d'été à différentes reprises. Il est généralement important d'obtenir le réel de la zone, et 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 que vous souhaitez la zone, et pas seulement le décalage. Pour les conversions en temps réel, il ne sera pas question beaucoup.
Maintenant, pour obtenir le fuseau horaire avec javascript, vous pouvez utiliser ceci:
Cependant je l'ai trouvé plus facile de simplement utiliser ce robuste plugin qui renvoie la Olsen formaté fuseau horaire:
https://github.com/scottwater/jquery.detect_timezone
OriginalL'auteur Keyo
De soumettre le décalage horaire comme un en-tête HTTP sur des requêtes AJAX avec jQuery
Vous pouvez également faire la même chose pour obtenir le temps réel nom de la zone en utilisant
moment.tz.guess();
de http://momentjs.com/timezone/docs/#/using-timezones/guessing-user-timezone/Modifié pour inclure d'info à propos de faire de même pour le nom du fuseau horaire.
OriginalL'auteur philfreo
Avec le PHP
date
fonction, vous obtiendrez la date heure du serveur sur lequel le site est situé. La seule façon d'obtenir le temps de l'utilisateur est d'utiliser JavaScript.Mais je vous suggère, si votre site dispose d'inscription nécessaire, alors la meilleure façon est de demander à l'utilisateur pendant que d'avoir l'inscription comme un champ obligatoire. Vous pouvez afficher la liste des fuseaux horaires différents dans la page d'enregistrement et enregistrer dans la base de données. Après cela, si l'utilisateur se connecte au site, alors vous pouvez définir le fuseau horaire par défaut pour cette session que par les utilisateurs fuseau horaire sélectionné.
Vous pouvez définir n'importe quel moment précis de la zone à l'aide de la fonction PHP
date_default_timezone_set
. Cela définit le fuseau horaire spécifié pour les utilisateurs.Fondamentalement le temps aux utilisateurs de la zone est pour le côté client, donc nous devons utiliser le JavaScript pour cela.
Ci-dessous le script pour obtenir du temps aux utilisateurs de la zone à l'aide de PHP et de JavaScript.
Mais selon mon point de vue, il est préférable de demander aux utilisateurs si l'inscription est obligatoire dans votre projet.
OriginalL'auteur Sanjay Khatri
Facile, il suffit d'utiliser le JavaScript
getTimezoneOffset
fonction de la façon:Aussi, il retourne uniquement le décalage horaire - pas le fuseau horaire. Voir le fuseau horaire balise wiki.
C'est une juste une copie de la accepté de répondre, pourquoi vous avez même droit de vote.
OriginalL'auteur JoeyFur62
JavaScript:
Simplement fournir votre temps en timestamp Unix format de cette fonction; JavaScript connaît déjà le fuseau horaire de l'utilisateur.
Comme ceci:
PHP:
Ce sera toujours montrer à la fois correctement en fonction du fuseau horaire de la personne a mis sur son horloge de l'ordinateur. Il n'est pas nécessaire de demander rien à personne et de l'enregistrer dans des endroits, dieu merci!
OriginalL'auteur Envis
La magie tout semble être dans
C'est cool, je ne savais pas à ce sujet. Cela fonctionne dans Internet Explorer, etc? De là, vous devriez être en mesure d'utiliser JavaScript, Ajax, créer des cookies, que ce soit. Je serais probablement aller le cookie route moi-même.
Vous aurez besoin afin de permettre à l'utilisateur de le changer si. Nous avons essayé d'utiliser la géolocalisation (via maxmind) pour ce faire il y a longtemps, et c'était mal assez souvent - assez pour le faire pas la peine de le faire, afin que nous venons de permettre à l'utilisateur de définir dans leur profil, et de montrer un avis pour les utilisateurs qui n'ont pas encore choisi leur moment.
OriginalL'auteur Orion Edwards
Ne pas utiliser l'adresse IP pour déterminer avec certitude l'emplacement (et donc de fuseau horaire) - c'est parce que avec le NAT, proxy (de plus en plus populaire), et les Vpn, les adresses IP ne sont pas nécessairement refléter de façon réaliste l'utilisateur de l'emplacement réel, mais l'endroit où les serveurs de mise en œuvre de ces protocoles résident.
Similaire à la façon dont NOUS les indicatifs de zone sont plus utiles pour la recherche d'un téléphone de l'utilisateur, compte tenu de la popularité de la portabilité du numéro.
Adresse IP et d'autres techniques présentées ci-dessus sont utiles pour suggérant un défaut que l'utilisateur peut ajuster ou corriger.
OriginalL'auteur Jaime G
Si vous arrive d'être en utilisant OpenID pour l'authentification, Inscription Simple Extension permettrait de résoudre le problème pour les utilisateurs authentifiés (Vous aurez besoin de les convertir à partir de tz numérique).
Une autre option serait de déduire le fuseau horaire de l'agent de l'utilisateur du pays préférence. C'est un peu brut (méthode ne fonctionnera pas pour en-US), mais qui fait une bonne approximation.
OriginalL'auteur Dmitry Shechtman
Voici un article (avec code source) qui explique comment déterminer et utiliser localisée temps dans un ASP.NET (VB.NET, C#) application:
Temps
En bref, cette approche s'appuie sur le JavaScript
getTimezoneOffset
fonction qui renvoie la valeur qui est enregistré dans le cookie de session et utilisé par code-behind pour ajuster les valeurs de temps entre l'heure 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 n'y a plus impliqués (c'est pourquoi je créer un lien vers l'article), mais le code fourni le rend vraiment facile à utiliser. Je soupçonne que vous pouvez convertir la logique de PHP et d'autres langages (aussi longtemps que vous comprenez ASP.NET).L'article est disponible en format PDF ici: app.box.com/shared/bfvvmidtyg
La méthode de conversion de l'UTC, heure du serveur au client local temps décrit dans cet article est faux. En utilisant le client en cours de décalage pour régler l'heure UTC fois sur le serveur erronées "local" fois la moitié de l'année pour les paramètres régionaux du client que d'observer l'heure d'été. Considérez le scénario suivant: un client au royaume-UNI le 14 Jan 2013 (GMT+0000 l'Heure Standard) définit la date et l'heure du 21 Août 2015 à 14:00 (GMT+01 h 00 Heure Avancée de l'). Cela devient normalisé sur le serveur au 21 Août 2015 13:00 UTC. Le jour cela se produit, le client offset est 0, donc le temps de renvoyer au client sera 21 Août 2015 à 13:00.
Point valide, mais je n'ai pas la prétention de ce pare-balles solution. Si vous avez besoin de mettre en œuvre un très sensibles au temps de la solution, par exemple un billet de train de demande de réservation, alors vous devez trouver un plus complet (et complexe). Toutefois, pour de nombreuses applications, ce ne serait pas un problème. Parce que, dans de nombreux cas, nous voulons localiser GMT valeurs pour la session en cours. Maintenant, si vous avez une application qui a besoin d'enregistrer un timbre de temps pour certains même, dans l'avenir, et il ne peut pas tolérer DTS, puis une bonne façon serait de présenter une option pour gagner du temps directement en GMT. Si vous connaissez une meilleure option, s'il vous plaît partager.
OriginalL'auteur Alek Davis
C'est simple avec le JavaScript et le PHP:
Même si l'utilisateur peut mess avec son horloge interne et/ou le fuseau horaire, la meilleure façon que j'ai trouvée jusqu'à présent, pour obtenir le décalage, reste
new Date().getTimezoneOffset();
. Il est non-invasive, ne donne pas de maux de tête et élimine la nécessité de compter sur des tiers.Dire que j'ai une table,
users
, qui contient un champdate_created int(13)
, pour le stockage des timestamps Unix;En supposant un client
creates a new account
, les données sont reçues parpost
, et j'ai besoin deinsert/update
ladate_created column
avec le client timestamp Unix, pas du serveur.Depuis le timezoneOffset est nécessaire au moment de l'insertion/mise à jour, il est passé comme un supplément de $_POST élément lorsque le client soumet le formulaire, éliminant ainsi le besoin de le stocker dans des séances et/ou des cookies, et aucun serveur supplémentaire hits.
Dire que le serveur reçoit
tzo
comme$_POST['tzo']
;Insérer/mettre à jour
date_created=$user_timestamp
.Lors de la récupération de la date_created, vous pouvez convertir le timestamp de la sorte:
Maintenant, cet exemple peut adapter à ses besoins quand il s'agit de l'insertion d'un
first
timestamp... Quand il s'agit d'un supplément de timestamp, ou une table, vous pouvez envisager l'insertion de la tzo valeur dans la table des utilisateurs pour référence future, ou de le définir en tant que session ou un cookie.P. S. MAIS que faire si l'utilisateur se déplace et les commutateurs de fuseaux horaires. Se connecte à GMT+4, se déplace à une vitesse de GMT-1 et qui se connecte à nouveau. Dernière connexion serait à l'avenir.
Je pense que... nous pensons trop.
OriginalL'auteur man
Vous pourriez le faire sur le client avec moment-timezone et envoyer la valeur de serveur; exemple d'utilisation:
De nos jours, moment.js je n'est plus recommandé. Il y a beaucoup de petites alternatives (dayjs, date-pn). Moment est énorme.
OriginalL'auteur SummerBreeze
Une façon simple de le faire est par l'utilisation de:
Aussi, il retourne uniquement le décalage horaire - pas le fuseau horaire. Voir le fuseau horaire balise wiki.
OriginalL'auteur Naeem Ul Wahhab
Obtenir un valide TZ Base de données de fuseau horaire nom en PHP est un processus en deux étapes:
Avec JavaScript, obtenir le décalage horaire dans les minutes dans
getTimezoneOffset
. Ce décalage est positif si le fuseau horaire local est derrière l'UTC et négative si elle est en avance. Donc, vous devez ajouter un signe opposé à l'offset.Passer ce décalage de PHP.
En PHP convertir ce décalage dans un fuseau horaire valable du nom avec timezone_name_from_abbr fonction.
J'ai écrit un billet de blog sur: Comment Détecter le Fuseau horaire de l'Utilisateur en PHP. Il contient également une démo.
Intl.DateTimeFormat().resolvedOptions().timeZone
et de l'envoyer au serveur web. Ref: stackoverflow.com/questions/9772955/...OriginalL'auteur Useful Angle
Une option possible est d'utiliser la
Date
champ d'en-tête, qui est définie dans RFC 7231 et est censé inclure le fuseau horaire. Bien sûr, il n'est pas garanti que la valeur est vraiment le fuseau horaire du client, mais il peut être un point de départ commode.OriginalL'auteur Berislav Lopac
Voici comment je le fais. Ceci permettra de définir le PHP fuseau horaire par défaut de l'utilisateur du fuseau horaire local. Il suffit de coller les éléments suivants sur le haut de vos pages:
OriginalL'auteur Dane Iracleous
Essayer ce code PHP:
OriginalL'auteur pckabeer