sql >> Database >  >> RDS >> Mysql

Hoe een java.util.Date op te slaan in een MySQL-tijdstempelveld in de UTC/GMT-tijdzone?

Het korte antwoord is:

  • voeg "default-time-zone=utc" toe aan my.cnf
  • denk in uw code altijd in UTC, behalve bij het weergeven van datums voor uw gebruikers
  • gebruik bij het ophalen/instellen van datums of tijdstempels met JDBC altijd de parameter Kalender, ingesteld op UTC:

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

  • synchroniseer uw servers met NTP, of vertrouw alleen op de databaseserver om u te vertellen hoe laat het is.

Het lange antwoord is dit:

Bij het omgaan met datums en tijdzones in een database en met elke klantcode, raad ik meestal het volgende beleid aan:

  1. Configureer uw database om de UTC-tijdzone te gebruiken , in plaats van de lokale tijdzone van de server te gebruiken (tenzij het UTC is natuurlijk).

    • Hoe u dit doet, hangt af van uw databaseserver. Instructies voor MySQL zijn hier te vinden:http:/ /dev.mysql.com/doc/refman/5.0/en/time-zone-support.html . In principe moet je dit in my.cnf schrijven:default-time-zone=utc

    • Op deze manier kunt u uw databaseservers overal hosten, uw hostinglocatie eenvoudig wijzigen en meer in het algemeen datums op uw servers manipuleren zonder enige dubbelzinnigheid.

    • Als je echt de voorkeur geeft aan een lokale tijdzone, raad ik aan om op zijn minst de zomertijd uit te schakelen, want dubbelzinnige datums in je database kunnen een echte nachtmerrie zijn.
      • Als u bijvoorbeeld een telefoniedienst bouwt en zomertijd op uw databaseserver gebruikt, dan vraagt ​​u om problemen:er is geen manier om te zeggen of een klant die belde vanaf "2008- 10-26 02:30:00" tot "2008-10-26 02:35:00" belde eigenlijk voor 5 minuten of voor 1 uur en 5 minuten (ervan uitgaande dat de zomertijd op 26 oktober om 3 uur 's nachts plaatsvond)!
  2. Gebruik in uw applicatiecode altijd UTC-datums, behalve wanneer u datums weergeeft aan uw gebruikers.

    • Gebruik in Java bij het lezen uit de database altijd:

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

    • Als u dit niet doet, wordt aangenomen dat het tijdstempel in uw lokale tijdzone staat, in plaats van UTC.
  3. Synchroniseer uw servers of vertrouw alleen op de tijd van de databaseserver

    • Als je je webserver op één server (of meer) hebt en je databaseserver op een andere server, dan raad ik je ten zeerste aan om hun klokken te synchroniseren met NTP.

    • OF, vertrouw slechts op één server om u te vertellen hoe laat het is. Meestal is de databaseserver de beste om tijd te vragen. Met andere woorden, vermijd code zoals deze:

    prepareStatement =connection.prepareStatement("UPDATE my_table SET my_time =? WHERE [...]");
    java.util.Date now =new java.util.Date(); // lokale tijd! :-(
    preparedStatement.setTimestamp(1, new Timestamp(now.getTime()));
    int resultaat =prepareStatement.execute();

    • Vertrouw in plaats daarvan op de tijd van de databaseserver:

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

Ik hoop dat dit helpt! :-)



  1. Hibernate eqOrIsNull() gebruiken

  2. Waarom gebruikt SQL Server indexscan in plaats van index zoeken wanneer de WHERE-component geparametriseerde waarden bevat?

  3. MySQL:hoe u het verschil tussen twee tijdstempels in seconden kunt krijgen

  4. Oracle SQL - Som en groepeer gegevens per week