Converta a hora ruby ​​em fuso horário do servidor

No aplicativo da web tem que lidar com cerca de 4 fusos horários diferentes:

  • fuso horário do aplicativo
  • fuso horário do usuário
  • fuso horário do servidor
  • fuso horário do banco de dados

Fuso horário do aplicativo

Geralmente o mesmo ocorre com o fuso horário do local da sua empresa, também geralmente um fuso horário padrão.

Rails.configuration.time_zone # => "Jakarta"
# or
MyApp::Application.config.time_zone

Fuso horário do usuário

O fuso horário do usuário atual pode ser salvo no perfil do usuário ou desviado do javascript, por exemplo, http://pellepim.bitbucket.org/jstz/

Normalmente definido como:
ruby Time.zone

Fuso horário do servidor

É uma hora do sistema do servidor atual, principalmente UTC, mas às vezes pode ser uma hora da localização do datacenter. Em desenvolvimento, é o fuso horário da máquina do desenvolvedor. Você pode precisar dele se quiser fazer uma tarefa cron. O Cron funciona no fuso horário do servidor.

Para calculá-lo, tenho uma função útil que utilizo com gem sempre que :

# Your business timezone 
Time.zone = "Asia/Jakarta"

def to_server_time(time_str)
time
= Time.zone.parse(time_str)
server_offset
= Time.now.getlocal.utc_offset.to_f / 1.hour
time
.in_time_zone(server_offset)
end

to_server_time
('00:30') # => Sun, 28 Sep 2014 17:30:00 WET +00:00
to_server_time
('00:30').strftime("%H:%M") # => "17:30"

Fuso horário do banco de dados

Mysql não armazena fuso horário no datetimeformato, mas Postgresql sim. De qualquer forma, é melhor se todas as datas no banco de dados tiverem o mesmo fuso horário. Normalmente é UTC ou pode ser personalizado:

Rails.configuration.active_record.default_timezone
# or
config
.active_record.default_timezone