sql >> Databasteknik >  >> RDS >> Mysql

Hur lagrar jag ett java.util.Date i ett MySQL-tidsstämpelfält i UTC/GMT-tidszonen?

Det korta svaret är:

  • lägg till "default-time-zone=utc" till my.cnf
  • i din kod, "tänk" alltid i UTC, förutom när du visar datum för dina användare
  • när du hämtar/ställer in datum eller tidsstämplar med JDBC, använd alltid parametern Kalender, inställd på UTC:

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

  • Antingen synkronisera dina servrar med NTP, eller lita bara på att databasservern berättar vad klockan är.

Det långa svaret är detta:

När jag hanterar datum och tidszoner i en databas och med eventuell klientkod rekommenderar jag vanligtvis följande policy:

  1. Konfigurera din databas för att använda UTC-tidszon , istället för att använda serverns lokala tidszon (såvida det inte är UTC förstås).

    • Hur man gör det beror på din databasserver. Instruktioner för MySQL finns här:http:/ /dev.mysql.com/doc/refman/5.0/en/time-zone-support.html . I grund och botten måste du skriva detta i my.cnf:default-time-zone=utc

    • På så sätt kan du vara värd för dina databasservrar var som helst, enkelt ändra din värdplats och mer allmänt manipulera datum på dina servrar utan tvetydighet.

    • Om du verkligen föredrar att använda en lokal tidszon rekommenderar jag att du åtminstone stänger av sommartid, eftersom att ha tvetydiga datum i din databas kan vara en riktig mardröm.
      • Till exempel, om du bygger en telefonitjänst och du använder sommartid på din databasserver så ber du om problem:det kommer inte att finnas något sätt att avgöra om en kund som ringde från "2008- 10-26 02:30:00" till "2008-10-26 02:35:00" ringde faktiskt i 5 minuter eller i 1 timme och 5 minuter (förutsatt att sommartid inträffade den 26 oktober kl. 03.00)!
  2. Använd alltid UTC-datum i din applikationskod, förutom när du visar datum för dina användare.

    • I Java, när du läser från databasen, använd alltid:

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

    • Om du inte gör detta antas tidsstämpeln vara i din lokala tidszon istället för UTC.
  3. Synkronisera dina servrar eller lita bara på databasserverns tid

    • Om du har din webbserver på en server (eller flera) och din databasserver på någon annan server, rekommenderar jag starkt att du synkroniserar deras klockor med NTP.

    • ELLER, lita bara på en server för att tala om för dig vad klockan är. Vanligtvis är databasservern den bästa att be om tid. Med andra ord, undvik kod som denna:

    readyStatement =connection.prepareStatement("UPPDATERA min_tabell SETT min_tid =? WHERE [...]");
    java.util.Date now =new java.util.Date(); // lokal tid! :-(
    preparedStatement.setTimestamp(1, new Timestamp(now.getTime()));
    int result =readyStatement.execute();

    • Lita istället på databasserverns tid:

    prepareradeStatement =connection.prepareStatement("UPPDATERA min_tabell SETT min_tid =NU() WHERE [...]");
    int resultat =prepareradeStatement.exekvera();

Hoppas det här hjälper! :-)



  1. Hur WEIGHT_STRING()-funktionen fungerar i MySQL

  2. Databasmodell för ett meddelandesystem

  3. Datamaskering i realtid med utlösare

  4. SYSDATE() vs NOW() i MySQL:Vad är skillnaden?