Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como armazenar um java.util.Date em um campo de carimbo de data/hora do MySQL no fuso horário UTC/GMT?


A resposta curta é:
  • adicione "default-time-zone=utc" a my.cnf
  • em seu código, sempre "pense" em UTC, exceto ao exibir datas para seus usuários

  • ao obter/definir datas ou timestamps com JDBC, sempre use o parâmetro Calendar, definido como UTC:

    resultset.getTimestamp("my_date", Calendar.getInstance(TimeZone.getTimeZone("UTC")));
  • sincronize seus servidores com NTP ou confie apenas no servidor de banco de dados para informar que horas são.

A resposta longa é esta:

Ao lidar com datas e fusos horários em qualquer banco de dados e com qualquer código de cliente, costumo recomendar a seguinte política:

  1. Configure seu banco de dados para usar o fuso horário UTC , em vez de usar o fuso horário local do servidor (a menos que seja UTC, é claro).

    • Como fazer isso depende do seu servidor de banco de dados. Instruções para MySQL podem ser encontradas aqui:http:/ /dev.mysql.com/doc/refman/5.0/en/time-zone-support.html . Basicamente você precisa escrever isso em my.cnf:default-time-zone=utc

    • Dessa forma, você pode hospedar seus servidores de banco de dados em qualquer lugar, alterar seu local de hospedagem facilmente e, de maneira mais geral, manipular datas em seus servidores sem qualquer ambiguidade.
    • Se você realmente preferir usar um fuso horário local, recomendo pelo menos desativar o horário de verão, porque ter datas ambíguas em seu banco de dados pode ser um verdadeiro pesadelo.
      • Por exemplo, se você estiver criando um serviço de telefonia e estiver usando o horário de verão em seu servidor de banco de dados, estará procurando problemas:não haverá como saber se um cliente que ligou de "2008- 10-26 02:30:00" a "2008-10-26 02:35:00" na verdade chamado por 5 minutos ou por 1 hora e 5 minutos (supondo que o horário de verão ocorreu em 26 de outubro às 3h)!

  2. Dentro do código do seu aplicativo, sempre use datas UTC, exceto ao exibir datas para seus usuários.
    • Em Java, ao ler do banco de dados, sempre use:

    Timestamp myDate =resultSet.getTimestamp("my_date", Calendar.getInstance(TimeZone.getTimeZone("UTC")));
    • Se você não fizer isso, o carimbo de data/hora será considerado em seu fuso horário local, em vez de UTC.

  3. Sincronize seus servidores ou confie apenas no tempo do servidor de banco de dados

    • Se você tem seu servidor Web em um servidor (ou mais) e seu servidor de banco de dados em algum outro servidor, então eu recomendo fortemente que você sincronize seus relógios com NTP.

    • OU, conte apenas com um servidor para lhe dizer que horas são. Normalmente, o servidor de banco de dados é o melhor para pedir tempo. Em outras palavras, evite códigos como este:

    PreparedStatement =connection.prepareStatement("UPDATE my_table SET my_time =? WHERE [...]");
    java.util.Date now =new java.util.Date(); // horário local! :-(
    preparedStatement.setTimestamp(1, new Timestamp(now.getTime()));
    int resultado =preparedStatement.execute();
    • Em vez disso, confie no horário do servidor de banco de dados:

    PreparedStatement =connection.prepareStatement("UPDATE my_table SET my_time =NOW() WHERE [...]");
    int resultado =PreparedStatement.execute();

Espero que isto ajude! :-)