Preservando fusos horários no Rails

Se eu tiver uma seqüência de tempo do formulário "Wed, 22 Jun 2011 09:43:58 +0200" proveniente de um cliente, desejo armazená-lo com o fuso horário preservado. Isso é importante porque não é apenas o horário UTC absoluto que é importante, mas também o fuso horário.

Time.zone.parse(t) converterá a hora para qualquer que seja a zona que Time.zone esteja usando no momento, perdendo o fuso horário de origem.

Preciso extrair manualmente o fuso horário da string acima ou há uma maneira idiomática de fazer isso?

Um campo DateTime só pode armazenar ‘AAAA-MM-DD HH: MM: SS’ ( MySQL ), sem informações de fuso horário.

Você deve armazenar o datetime em UTC e o fuso horário em um campo diferente, preferencialmente como um inteiro especificando o deslocamento do UTC em minutos.

Você pode extrair o deslocamento assim:

 ruby-1.9.2-p180:001:0>> require 'active_support/all' # included by Rails by default # => true ruby-1.9.2-p180:002:0>> dt = DateTime.parse "Wed, 22 Jun 2011 09:43:58 +0200" # => Wed, 22 Jun 2011 09:43:58 +0200 ruby-1.9.2-p180:003:0>> dt.utc_offset # => 7200 ruby-1.9.2-p180:004:0>> dt.utc # => Wed, 22 Jun 2011 07:43:58 +0000 

EDITAR:

E para ida e volta o exercício

 ruby-1.9.2-p180 :039 > u.utc.new_offset(u.offset) => Wed, 22 Jun 2011 09:43:58 +0500 ruby-1.9.2-p180 :040 > u => Wed, 22 Jun 2011 09:43:58 +0500 

Eu acho que você está procurando a seguinte solução:

No ApplicationController:

 before_filter :get_tz def get_tz @tz = current_user.time_zone end def use_tz Time.use_zone @tz do yield end end 

E em um controlador adicionar ao redor do filtro no beginnig

 around_filter :use_tz