sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo almacenar un java.util.Date en un campo de marca de tiempo de MySQL en la zona horaria UTC/GMT?

La respuesta corta es:

  • añadir "default-time-zone=utc" a my.cnf
  • en su código, siempre "piense" en UTC, excepto cuando muestre fechas para sus usuarios
  • al obtener/establecer fechas o marcas de tiempo con JDBC, siempre use el parámetro Calendario, establecido en UTC:

    resultset.getTimestamp("my_date", Calendar.getInstance(TimeZone.getTimeZone("UTC")));

  • sincronice sus servidores con NTP o confíe solo en el servidor de la base de datos para saber qué hora es.

La respuesta larga es esta:

Cuando se trata de fechas y zonas horarias en cualquier base de datos y con cualquier código de cliente, suelo recomendar la siguiente política:

  1. Configure su base de datos para usar la zona horaria UTC , en lugar de usar la zona horaria local del servidor (a menos que sea UTC, por supuesto).

    • Cómo hacerlo depende de su servidor de base de datos. Las instrucciones para MySQL se pueden encontrar aquí:http:/ /dev.mysql.com/doc/refman/5.0/en/time-zone-support.html . Básicamente, debe escribir esto en my.cnf:default-time-zone=utc

    • De esta manera, puede alojar sus servidores de base de datos en cualquier lugar, cambiar su ubicación de alojamiento fácilmente y, en general, manipular las fechas en sus servidores sin ninguna ambigüedad.

    • Si realmente prefiere usar una zona horaria local, le recomiendo al menos desactivar el horario de verano, porque tener fechas ambiguas en su base de datos puede ser una verdadera pesadilla.
      • Por ejemplo, si está creando un servicio de telefonía y está utilizando el horario de verano en su servidor de base de datos, entonces está buscando problemas:no habrá forma de saber si un cliente que llamó desde "2008- 26-10 02:30:00" a "2008-10-26 02:35:00" en realidad llamó durante 5 minutos o durante 1 hora y 5 minutos (suponiendo que el horario de verano ocurriera el 26 de octubre a las 3 a.m.)!
  2. Dentro del código de su aplicación, use siempre las fechas UTC, excepto cuando muestre las fechas a sus usuarios.

    • En Java, al leer de la base de datos, siempre use:

    Marca de tiempo myDate =resultSet.getTimestamp("my_date", Calendar.getInstance(TimeZone.getTimeZone("UTC")));

    • Si no hace esto, se asumirá que la marca de tiempo está en su zona horaria local, en lugar de UTC.
  3. Sincronice sus servidores o confíe únicamente en la hora del servidor de la base de datos

    • Si tiene su servidor web en un servidor (o más) y su servidor de base de datos en algún otro servidor, le recomiendo que sincronice sus relojes con NTP.

    • O, solo confíe en un servidor para decirle qué hora es. Por lo general, el servidor de la base de datos es el mejor para pedir tiempo. En otras palabras, evita código como este:

    PrepareStatement =conexión.prepareStatement("ACTUALIZAR my_table SET my_time =? DONDE [...]");
    java.util.Date now =new java.util.Date(); // ¡hora local! :-(
    preparedStatement.setTimestamp(1, nueva marca de tiempo(ahora.getTime()));
    int resultado =preparadoStatement.execute();

    • En su lugar, confíe en la hora del servidor de la base de datos:

    instrucciónpreparada =conexión.prepareStatement("ACTUALIZAR mi_tabla CONFIGURAR mi_hora =AHORA() DONDE [...]");
    int resultado =instrucciónpreparada.ejecutar();

¡Espero que esto ayude! :-)