Krátká odpověď je:
- přidejte "default-time-zone=utc" do my.cnf
- v kódu vždy „přemýšlejte“ v UTC, s výjimkou zobrazení dat pro vaše uživatele
-
při získávání/nastavení dat nebo časových razítek pomocí JDBC vždy použijte parametr Kalendář nastavený na UTC:
resultset.getTimestamp("moje_datum", Calendar.getInstance(TimeZone.getTimeZone("UTC")));
- buď synchronizujte své servery s NTP, nebo se spolehněte pouze na databázový server, který vám řekne, kolik je hodin.
Dlouhá odpověď je tato:
Při práci s daty a časovými pásmy v jakékoli databázi a s jakýmkoli klientským kódem obvykle doporučuji následující zásady:
-
Nakonfigurujte svou databázi tak, aby používala časové pásmo UTC , namísto použití místního časového pásma serveru (samozřejmě pokud to není UTC).
-
Jak to udělat, závisí na vašem databázovém serveru. Pokyny pro MySQL naleznete zde:http:/ /dev.mysql.com/doc/refman/5.0/en/time-zone-support.html . V zásadě to musíte napsat do my.cnf:default-time-zone=utc
-
Tímto způsobem můžete své databázové servery hostovat kdekoli, snadno změnit umístění hostingu a obecněji bez jakýchkoliv nejasností manipulovat s daty na svých serverech.
- Pokud opravdu dáváte přednost používání místního časového pásma, doporučuji alespoň vypnout letní čas, protože nejednoznačná data v databázi může být skutečná noční můra.
- Pokud například budujete telefonní službu a na svém databázovém serveru používáte letní čas, koledujete si o problém:nebude možné zjistit, zda zákazník, který volal z roku 2008- 10-26 02:30:00" až "2008-10-26 02:35:00" skutečně volalo 5 minut nebo 1 hodinu a 5 minut (za předpokladu, že letní čas nastal 26. října ve 3:00)!
-
-
V kódu aplikace vždy používejte data UTC, s výjimkou zobrazení dat uživatelům.
- V Javě při čtení z databáze vždy použijte:
Timestamp myDate =resultSet.getTimestamp("my_date", Calendar.getInstance(TimeZone.getTimeZone("UTC")));
- Pokud tak neučiníte, bude se předpokládat, že časové razítko je ve vašem místním časovém pásmu, nikoli v UTC.
-
Synchronizujte své servery nebo se spoléhejte pouze na čas databázového serveru
-
Pokud máte svůj webový server na jednom serveru (nebo více) a databázový server na jiném serveru, pak důrazně doporučuji synchronizovat jejich hodiny s NTP.
-
NEBO se spoléhejte pouze na jeden server, který vám řekne, kolik je hodin. Obvykle je databázový server tím nejlepším, kdo se ptá na čas. Jinými slovy, vyhněte se kódu, jako je tento:
PrepareStatement =connection.prepareStatement("UPDATE my_table SET my_time =? WHERE [...]");
java.util.Date now =new java.util.Date(); // místní čas! :-(
preparedStatement.setTimestamp(1, new Timestamp(now.getTime()));
int result =PrepareStatement.execute();- Místo toho se spolehněte na čas databázového serveru:
readyStatement =connection.prepareStatement("UPDATE my_table SET my_time =NOW() WHERE [...]");
int result =PrepareStatement.execute(); -
Snad to pomůže! :-)