Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak przechowywać plik java.util.Date w polu znacznika czasu MySQL w strefie czasowej UTC/GMT?

Krótka odpowiedź brzmi:

  • dodaj „default-time-zone=utc” do my.cnf
  • w swoim kodzie zawsze „myśl” w UTC, z wyjątkiem wyświetlania dat dla użytkowników
  • podczas pobierania/ustawiania dat lub znaczników czasu za pomocą JDBC zawsze używaj parametru Calendar, ustawionego na UTC:

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

  • albo zsynchronizuj swoje serwery z NTP, albo polegaj tylko na serwerze bazy danych, który powie Ci, która jest godzina.

Długa odpowiedź brzmi:

Mając do czynienia z datami i strefami czasowymi w dowolnej bazie danych oraz z dowolnym kodem klienta, zazwyczaj zalecam następującą politykę:

  1. Skonfiguruj bazę danych tak, aby korzystała ze strefy czasowej UTC , zamiast używać lokalnej strefy czasowej serwera (oczywiście chyba że jest to UTC).

    • Sposób wykonania zależy od serwera bazy danych. Instrukcje dotyczące MySQL można znaleźć tutaj:http:// /dev.mysql.com/doc/refman/5.0/en/time-zone-support.html . Zasadniczo musisz napisać to w my.cnf:default-time-zone=utc

    • W ten sposób możesz hostować swoje serwery baz danych w dowolnym miejscu, łatwo zmieniać lokalizację hostingu i ogólniej manipulować datami na swoich serwerach bez żadnych niejasności.

    • Jeśli naprawdę wolisz używać lokalnej strefy czasowej, polecam przynajmniej wyłączenie czasu letniego, ponieważ niejednoznaczne daty w bazie danych mogą być prawdziwym koszmarem.
      • Na przykład, jeśli budujesz usługę telefoniczną i korzystasz z czasu letniego na serwerze bazy danych, prosisz o kłopoty:nie będzie sposobu, aby stwierdzić, czy klient, który dzwonił od „2008- 10-26 02:30:00” do „2008-10-26 02:35:00” faktycznie dzwonił przez 5 minut lub przez 1 godzinę i 5 minut (przypuśćmy, że czas letni miał miejsce 26 października o 3 nad ranem)!
  2. W kodzie aplikacji zawsze używaj dat UTC, z wyjątkiem sytuacji, gdy wyświetlasz daty użytkownikom.

    • W Javie podczas odczytu z bazy danych zawsze używaj:

    Znacznik czasu mojaData =resultSet.getTimestamp("moja_data", Calendar.getInstance(TimeZone.getTimeZone("UTC")));

    • Jeśli tego nie zrobisz, zakłada się, że znacznik czasu znajduje się w Twojej lokalnej Strefie Czasowej, a nie UTC.
  3. Synchronizuj swoje serwery lub polegaj tylko na czasie serwera bazy danych

    • Jeśli masz serwer WWW na jednym serwerze (lub więcej), a serwer bazy danych na innym serwerze, zdecydowanie zalecamy synchronizację ich zegarów z NTP.

    • LUB polegaj tylko na jednym serwerze, aby poinformować Cię, która jest godzina. Zwykle serwer bazy danych najlepiej pyta o czas. Innymi słowy, unikaj kodu takiego jak ten:

    readyStatement =connection.prepareStatement("UPDATE moja_tabela SET mój_czas =? GDZIE [...]");
    java.util.Date now =new java.util.Date(); // czas lokalny! :-(
    preparedStatement.setTimestamp(1, new Timestamp(now.getTime()));
    int wynik =przygotowanyStatement.execute();

    • Zamiast tego polegaj na czasie serwera bazy danych:

    PrepareStatement =connection.prepareStatement("UPDATE moja_tabela SET mój_czas =TERAZ() GDZIE [...]");
    int wynik =Preparement.execute();

Mam nadzieję że to pomoże! :-)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Używanie instrukcji IF w zapytaniu MySQL SELECT

  2. Musisz pobrać dane produktu z bazy danych mysql

  3. Dlaczego to połączenie Hibernate MySQL jest tylko do odczytu?

  4. Jakie jest domyślne hasło roota dla MySQL 5.7?

  5. Wpisy SQL, które wygasają po 24 godzinach