2009-05-19 10 views
4

Existe-t-il un moyen de déterminer le fuseau horaire d'un agent utilisateur sans javasript?Déterminer le décalage de fuseau horaire de l'agent utilisateur sans utiliser javascript?

normalement, j'exécuter ce bout de javascript:

<script type="text/javascript" language="JavaScript"> 
var offset = new Date(); 
document.write('<input type="hidden" id="clientTzOffset" 
name="clientTzOffset" value="' + offset.getTimezoneOffset() + '"/>'); 
</script> 

Cependant, pour beaucoup de mobiles et des clients, JS est soit non Existant ou éteint. Y a-t-il quelque chose d'intelligent que je puisse faire ou suis-je réduit à "me dire où tu es et à quelle heure tu es?"

Répondre

2

Peut-être avec un langage côté serveur que vous pourriez faire une recherche IP, puis déterminer de leur pays quel est le fuseau qu'ils pourraient être.

J'imagine que cela pourrait être problématique, cependant.

Si vous descendez cette route, cette question (et les réponses) peut vous être utile.

Getting the location from an IP address

+0

cela pourrait être une bonne première approximation. Comment corréleriez-vous ip à la géolocalisation/fuseau horaire? – MikeJ

+0

De bonnes bases de données GeoIP peuvent certainement vous donner un fuseau horaire (voir http://www.siafoo.net/article/53). Cependant, ce sera moins précis que JS. –

+0

@Matthew - bien sûr, cependant, avec des agents utilisateurs manquant de JS - tels que les téléphones mobiles, c'est mieux que rien ... – MikeJ

5

utiliser les deux. Avoir javascript définir la valeur par défaut d'une liste ou un champ de texte. Le pourcentage de personnes sans javascript est si petit que le fardeau est minime. J'allais dire "Utilisez la date de demande: en-tête" mais c'est un en-tête de réponse seulement il semble.

1

J'ai vu un site Web où, au lieu de demander quel fuseau horaire l'utilisateur était dedans, il a simplement demandé "choisir l'heure correcte" et il leur a montré une liste de fois. C'est une différence subtile de "quel fuseau horaire êtes-vous" mais beaucoup plus facile à comprendre. Malheureusement je ne trouve plus le site

+0

Malheureusement, ce n'est pas la même chose. Il peut être la même heure dans différents fuseaux horaires en raison de l'heure d'été et d'autres considérations. –

3

J'ai pensé à une autre solution mais c'est un peu complexe. Configurez de fausses requêtes HEAD avec un en-tête de réponse max-age: 1 pour contraindre le navigateur à les ré-extraire. Vous devriez alors recevoir un si-Modified-Since-tête de tout navigateur moderne comme ceci:

If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT 

Faites juste attention de ne pas envoyer les en-têtes Last-Modified la première réponse parce que

pour obtenir le meilleur résultats lors de l'envoi d'un champ d'en-tête Modified-Since If- pour la validation du cache, les clients sont invités à utiliser la chaîne de date exacte reçue dans un champ Last- modifié chaque fois que possible.

Notez la clause de non-responsabilité "dans la mesure du possible". Ceci, et d'autres parties de la description de l'en-tête impliquent que le client utilisera sa propre horloge lorsqu'il ne saura rien des serveurs.

Avec la bonne combinaison d'en-têtes, cela pourrait très bien fonctionner.

EDIT: Essayé quelques tests avec FF mais n'a pas trouvé une combinaison valide d'en-têtes pour déclencher un if-modified-since dans le temps client. FF n'envoie l'en-tête que s'il a déjà reçu un en-tête modifié en dernier, puis il reflète simplement la valeur en retour (même si ce n'est pas une date valide).

+0

Très intelligent. Quand je serai au bureau plus tard aujourd'hui, je vais mettre cela en place. Je pense que vous pourriez avoir quelque chose ici. – MikeJ