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.