Al's blog

Alexis Toulotte

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 :

TimeZone select

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.