problema com hora no servidor

325 views
Skip to first unread message

Edson Lima

unread,
Feb 12, 2014, 7:19:40 AM2/12/14
to rail...@googlegroups.com
Criei uma funcionalidade que usa o created_at de um registro para saber a produção, por hora, de usuários. Mas a hora que o sistema armazena é diferente da hora de trabalho do usuário, está adiantada em 2h. Fui no servidor executei date e a hora que aparece é igual a da minha maquina, como é no Linode, também conferi a hora nos gráficos e também é igual a da minha maquina. O fato de ser igual a da minha maquina pode ser coincidência. Peço ajuda para resolver isto.

Obrigado pela atenção.

MrBiTs

unread,
Feb 12, 2014, 7:49:34 AM2/12/14
to rail...@googlegroups.com
Olá, Edson. Já oviu falar de fusos horários ? A hora não está "adiantada em duas horas". A configuração do timezone aponta Zulu
Time, ou UTC, ou GMT-0, que é a hora do Meridiano de Greenwich. Eu acho que estudei isso na 3a ou 4a série, mas era começo da década
de 80 e os professores ainda podiam dar bronca na gente. Hoje eu duvido que eles ensinem isso.

De qualquer maneira, se a hora do servidor (comando date) está de acordo com a nossa hora local (estamos no meridiano -3, ou seja,
estamos com 3 horas a menos que o meridiano de Greenwich, que fica em Londres [GMT = Greenwich Meridian Time], mas estamos em
horário de verão, então temos nossos relógios adiantados em uma hora em várias partes do país, então temos GTM-2 ou BRST [Brazilian
Summer Time]; esse é o motivo das "duas horas adiantadas"), então ou seu banco de dados está com timezone configurado para GMT ou
sua aplicação está configurada dessa maneira.

Como você não dá detalhes sobre mais nada, é isso que posso te dizer. O resto é por sua conta.


--

LLAP

.0. MrBiTs - mrbit...@gmail.com .'.
..0 GnuPG - http://keyserver.fug.com.br:11371/pks/lookup?op=get&search=0x6EC818FC2B3CA5AB
000 http://www.mrbits.com.br


Edson Lima

unread,
Feb 12, 2014, 7:59:58 AM2/12/14
to rail...@googlegroups.com
Obrigado pela ideia. Só acho estranho é executar o comando date no servidor (conectado com ssh) e também executar um comando para recurar a hora no pgadmin conectado no servidor e ambos trazem a hora local.

Vou checar a questão do timezone.

Obrigado

Francisco

unread,
Feb 13, 2014, 8:26:15 AM2/13/14
to rail...@googlegroups.com
No config/application.rb você pode definir as configurações de time zone.

Edson Lima

unread,
Feb 18, 2014, 2:30:55 PM2/18/14
to rail...@googlegroups.com
Coloquei 'Brasilia', mas deu erro na produção.

Edson Lima

unread,
Feb 27, 2014, 1:08:12 PM2/27/14
to rail...@googlegroups.com
Ainda estou com este problema. Alterei o time_zone no enviroment  para 'Brasilia' e depois para 'UTC', tentei em outras maquinas e navegadores, verifiquei a hora no servidor e estava correta. Mas continua a hora errada sendo salva no banco.

rails 2.3.17
ruby 1.8.7

Jonathan Celestino Calixto

unread,
Feb 27, 2014, 2:02:12 PM2/27/14
to Grupos Rails BR
Ola pessoal, 

Primeiro, deveria instalar o uma biblioteca ntp: sudo apt-get install ntp
Segundo, os campos created_at, updated_at, em particular, e os outros campos datetime, sempre salvam no banco com o Timezone UTC, ou seja se é 8:00 em brasilia, este campo será salvo como 11:00, ou 10:00 no horario de verão, para converter é só executar model.created_at.local.
Terceiro, no application.rb deveria ficar assim:     config.time_zone = ‘Brasilia'

espero ter ajudado.

Atenciosamente,

Jonathan Celestino Calixto
Desenvolvedor Web Ruby on Rails
email:     jonathan...@hite.com.br
msn:       jonathan...@gmail.com
github:    https://github.com/jonathanccalixto
skype:    jonathanccalixto
twitter:    jonathanccalixt

--
--
Você recebeu essa mensagem porquê está inscrito no Google
Groups "rails-br".
Para enviar uma mensagem para o grupo, mande um email para rail...@googlegroups.com
Para se descadastrar, mande um e-mail para
rails-br+u...@googlegroups.com
Visite o grupo em http://groups.google.com/group/rails-br?hl=pt-BR
Leia nossa política de uso: http://goo.gl/YGgt7
 
---
Você está recebendo esta mensagem porque se inscreveu no grupo "rails-br" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para rails-br+u...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.

Edson Lima

unread,
Feb 27, 2014, 2:16:27 PM2/27/14
to rail...@googlegroups.com
Fiquei em dúvida de onde e quando colocar o model.created_at.local?

Jonathan Celestino Calixto

unread,
Feb 28, 2014, 4:28:22 AM2/28/14
to Grupos Rails BR
o model.created_at.local é para exibir a data da criação com o timezone local


Atenciosamente,

Jonathan Celestino Calixto
Desenvolvedor Web Ruby on Rails
email:     jonathan...@hite.com.br
msn:       jonathan...@gmail.com
github:    https://github.com/jonathanccalixto
skype:    jonathanccalixto
twitter:    jonathanccalixt

Everaldo Gomes

unread,
Feb 28, 2014, 7:28:11 AM2/28/14
to rail...@googlegroups.com
Vá no console e digite:

Time.current -> Local
Time.now -> UTC

Não ligue tanto para o que está armazenado no banco...veja o que o console retorna quando você faz:

model.created_at

Edson Lima

unread,
Feb 28, 2014, 8:19:44 AM2/28/14
to rail...@googlegroups.com
Coloco quando criar uma instancia do model?

Everaldo Gomes

unread,
Feb 28, 2014, 9:59:03 AM2/28/14
to rail...@googlegroups.com
Não, deve ser automático...tô falando isso só pra você testar...ver se configurou certo.

Loureiro

unread,
Mar 1, 2014, 7:39:23 PM3/1/14
to rail...@googlegroups.com
Algumas ideias que eu particularmente uso para fugir um pouco do "timezone hell":

* sempre use as mesmas funções de hora:
como o Everaldo falou, algumas funções retornam o horário UTC e outras baseado na timezone. Use uma ou outra em toda a sua app e evite misturá-las. Eu particularmente uso "0.ago" para tudo (ela retorna em UTC, com fuso +0). Ex.: 1.ago + 2.month.since - 1.day.ago

* não use as funções de data/hora do BD:
se você usa postgresql, evite usar o "now()" em uma consulta SQL, se uda o Mysql evite o "CURDATE()" e assim por diante. Pegue a data/hora via código Rails e passe para a query. Se necessário use tipos de dados sem timezone (no pg use o 'without timeone' ao criar um campo). Isto evita conflitos de fusos/horas desincronizadas entre web server e db server.

* somente nas views use funções com Timezone:
mantenha o BD sempre sem timezones, use somente UTC - como se fossem horas absolutas, não relativas ao local. Mas ao mostrar os dados, use helpers que considerem a timezone.

* se ainda assim tiver problemas force os seus arquivos de configuração a usarem os mesmos timezones:
verifique os arquivos de configuração do BD, o application.rb, force as conexões ao BD com comandos específicos do SGBD.

* NTP
o ntp é ótimo para manter a hora de todos os servidores sincronizados, mas ele não leva em consideração o timezone. Por exemplo, o horário de verão *não* afeta o seu retorno. O fuso deve sempre ser definido manualmente. O problema é que o fuso brasileiro por vezes não é definido segundo uma fórmula, mas sim conforme definição do ministério de minas e energia, que pode mudar a cada ano. Com isto as vezes pode ocorrer de o BD achar que para a data atual "Brasilia/Sao_Paolo" é +3 e o webserver achar que para a mesma data, mesmo estando na mesma máquina, a mesma definição de "Brasilia/Sao_Paolo" é +2.

Basicamente eu mantenho internamente tudo sem timezone (na verdade TZ +0), centralizo o controle da hora em um único responsável (a applicação Rails, ignorando as funções de data/hora de outros serviços), e somente ao externar a informação (na view) é que considero a TZ do usuário.
Reply all
Reply to author
Forward
0 new messages