Carlos Brando

Nome do Jogo

Como vai funcionar o novo suporte a TimeZones na próxima versão do Rails?

103050700_09e2ff6b95.jpg

Não sabemos ainda quando a versão 2.1(?) do Rails sairá, mas quem acompanha este blog já sabe das grandes novidades que acompanharão esta nova versão. Acredito que a mais interessante e importante novidade será o novo suporte nativo a timezones.

Criar um sistema que trabalha com fusos-horários diferentes hoje só é possível graças a gems como o TZInfo. Mas isto será trivial na próxima versão do Rails.

Para entender a necessidade disto, imagine um sistema simples para uma empresa de cursos de idiomas online, onde alunos do mundo todo podem agendar horários para suas aulas. Se eu agendar uma aula aqui para uma hora da tarde, meu professor que mora no Canadá deve ser avisado que a aula ocorrerá às dez horas da manhõ no horário dele. Se isto não acontecer, teremos uma tremenda confusão e um sistema assim seria um fracasso.

A solução para o problema é sempre convertermos os horários para o padrão UTC e na hora de exibir ou receber usarmos a hora local do usuário. Consegue imaginar o problema? Que problema? Isto será trivial, assim:

# informa o fuso-horário local
Time.zone = "Pacific Time (US & Canada)"

# Agora todas as datas/horas irão refletir o fuso-horário local
event = Event.new
event.when = Time.utc(2008, 1, 1, 0)
event.when #=> Mon, 31 Dec 2007 16:00:00 PST -08:00

Para facilitar ainda mais podemos usar um filtro no ApplicationController, algo assim:

class ApplicationController < ActionController::Base
  before_filter :set_timezone

  def set_timezone
    # current_user.time_zone #=> 'Pacific Time (US & Canada)'
    Time.zone = current_user.time_zone
  end
end

Pronto, problema resolvido.

Comments