Carlos Brando

Nome do Jogo

Edge Rails: Fuso-horário muito mais simples

Criar um software para a internet não é fácil, principalmente quando seus usuários estão espalhados por todo o mundo. Um dos maiores desafios neste caso é manipular fusos-horário. Hoje no Rails isto não é um bicho de sete cabeças graças a plugins como o TZInfo. Mas pelo visto este não é um problema só seu, ou meu, já que na próxima versão do Rails teremos este plugin praticamente incorporado ao framework.

Para explicar como funciona esta nova implementação, vou usar como base o excelente artigo de Ryan Daigle no seu blog Ryan’s Scraps.

Neste artigo Ryan nos mostra como definir o fuso-horário de seu aplicativo usando o método Time.zone, assim:

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

# Todas as datas agora refletem a hora local
article = Article.find(:first)
article.published_at #=> Wed, 30 Jan 2008 2:21:09 PST -08:00

# Informando novos horários em UTC, eles irão refletir a hora local
article.published_at = Time.utc(2008, 1, 1, 0)
article.published_at  #=> Mon, 31 Dec 2007 16:00:00 PST -08:00

Note que as datas passam a refletir o timezone escolhido.

Legal, mas como usar isto no mundo real?

Ryan dá uma dica interessante. Você pode usar um filtro (before_filter) para informar o fuso-horário, permitindo que seus usuários possam definir o timezone desejado. Mais ou menos assim:

class ApplicationController < ActionController::Base

  before_filter :set_timezone

  def set_timezone
    Time.zone = current_user.time_zone
  end
end

Mas, e se meu software só for usado no Brasil?

Se sua aplicação só trabalhará com um fuso-horário especifico, você pode configurá-lo no arquivo environment.rb:

Rails::Initializer.run do |config|
  config.time_zone = "Hawaii"
end

E por último se desejar recuperar o timezone atual:

Time.zone.now

Comments