Краткият отговор е:
- добавете "default-time-zone=utc" към my.cnf
- в кода си винаги „мислете“ в UTC, освен когато показвате дати за вашите потребители
-
когато получавате/задавате дати или времеви печати с JDBC, винаги използвайте параметъра Calendar, зададен на UTC:
resultset.getTimestamp("my_date", Calendar.getInstance(TimeZone.getTimeZone("UTC")));
- Или синхронизирайте сървърите си с NTP, или разчитайте само на сървъра на базата данни, за да ви каже колко е часът.
Дългият отговор е следният:
Когато се занимавате с дати и часови зони във всяка база данни и с всеки клиентски код, обикновено препоръчвам следната политика:
-
Конфигурирайте вашата база данни да използва UTC часова зона , вместо да използвате локалната часова зона на сървъра (освен ако не е UTC, разбира се).
-
Как да направите това зависи от вашия сървър на база данни. Инструкции за MySQL можете да намерите тук:http:/ /dev.mysql.com/doc/refman/5.0/en/time-zone-support.html . По принцип трябва да напишете това в my.cnf:default-time-zone=utc
-
По този начин можете да хоствате вашите сървъри на база данни навсякъде, да променяте лесно местоположението си на хостинг и по-общо да манипулирате датите на сървърите си без никаква двусмислие.
- Ако наистина предпочитате да използвате местна часова зона, препоръчвам поне да изключите лятното часово време, защото наличието на двусмислени дати във вашата база данни може да бъде истински кошмар.
- Например, ако изграждате телефонна услуга и използвате лятно часово време на вашия сървър на база данни, вие питате за проблеми:няма да има начин да разберете дали клиент, който се е обадил от „2008- 10-26 02:30:00" до "2008-10-26 02:35:00" всъщност се обади за 5 минути или за 1 час и 5 минути (ако приемем, че лятното часово време е настъпило на 26 октомври в 3 сутринта)!
-
-
В кода на приложението си винаги използвайте UTC дати, освен когато показвате дати на потребителите си.
- В Java, когато четете от базата данни, винаги използвайте:
Timestamp myDate =resultSet.getTimestamp("my_date", Calendar.getInstance(TimeZone.getTimeZone("UTC")));
- Ако не направите това, ще се приеме, че времевата марка е във вашата местна часова зона, вместо UTC.
-
Синхронизирайте сървърите си или разчитайте само на времето на сървъра на базата данни
-
Ако имате вашия уеб сървър на един сървър (или повече) и сървър на база данни на друг сървър, тогава силно препоръчвам да синхронизирате часовниците им с NTP.
-
ИЛИ разчитайте само на един сървър да ви каже колко е часът. Обикновено сървърът на базата данни е най-добрият, за да поискате време. С други думи, избягвайте код като този:
readyStatement =connection.prepareStatement("АКТУАЛИЗИРАНЕ на my_table SET my_time =? КЪДЕ [...]");
java.util.Date сега =нова java.util.Date(); // местно време! :-(
preparedStatement.setTimestamp(1, new Timestamp(now.getTime()));
int резултат =readyStatement.execute();- Вместо това разчитайте на времето на сървъра на базата данни:
readyStatement =connection.prepareStatement("АКТУАЛИЗИРАНЕ на my_table SET my_time =NOW() КЪДЕ [...]");
int result =readyStatement.execute(); -
Надявам се това да помогне! :-)