20 jan 11
TimeZone coté navigateur & RubyOnRails
Il est parfois utile d’afficher les dates et les heures selon la TimeZone de l’utilisateur dans nos applications Web.
Il y a la manière que l’on retrouve le plus (pénible à mon gout) qui consiste à la faire choisir à l’utlisateur via un énorme <select>, ceci qui ressemble à peu près à ça :

De plus, il faut ensuite stocker cette TimeZone en base de données ou dans un cookie. Bref, pénible pour le développeur et pour l’utilisateur.
C’est pourquoi, le mieux serait d’obtenir la TimeZone du navigateur directement. Malheureusement, les navigateurs n’envoient pas de header HTTP avec la TimeZone configurée sur la machine (un peu comme pour les locales). La seule manière donc, est d’utiliser Javascript.
Dans le petit script ci-dessous, on va stocker dans un cookie l’UTC offset.
var TimeZone = (function () { function getOffset() { return -(new Date().getTimezoneOffset()) * 60; } function init() { var offset = getOffset(); if (offset != Cookie.get('time_zone_offset')) Cookie.set('time_zone_offset', offset); } return { 'init': init } })(); document.observe('dom:loaded', TimeZone.init);
Note : les méthodes Cookie.get et Cookie.set sont issues d’un autre bout de Javascript. Demandez-moi si vous en avez besoin.
Maintenant coté serveur (Rails), on va changer la TimeZone en fonction de la valeur de ce cookie :
class ApplicationController < ActionController::Base before_filter :set_time_zone_from_cookies private def set_time_zone_from_cookies if cookies['time_zone_offset'].present? Time.zone = cookies['time_zone_offset'].to_i else Time.zone = Rails.configuration.time_zone end end end
On se retrouve maintenant avec les dates et les heures qui s’affichent correctement partout dans le monde.
2 commentaires sur « TimeZone coté navigateur & RubyOnRails »
C’est une super bonne idée pour un ordinateur bien configuré, par contre ça ne l’est pas quand il ne l’est pas: est-il sain d’obliger le luser de configurer correctement sa TimeZone dans son OS sans lui laisser un chance de l’écraser dans une webapp? (personnellement, je répondrai oui mais professionnellement: non).
On sera toujours obligé de laisser l’utilisateur overrider sa TZ :)
Dans la grande majeure partie des cas, les postes sont bien configurés. Certains (comme OSX) changent directement la TZ en fonction de l’ip. Après, je suis d’accord avec toi, il faut laisser le choix à l’utilisateur. Mais, pour les applis où il n’y a pas d’inscription (blogs, etc.), cela convient plutôt bien. De plus, les personnes qui changent régulièrement de TZ devraient apprécier :)