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 datetime
formato, 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