Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да съхраня java.util.Date в полето за време на MySQL в часовата зона UTC/GMT?

Краткият отговор е:

  • добавете "default-time-zone=utc" към my.cnf
  • в кода си винаги „мислете“ в UTC, освен когато показвате дати за вашите потребители
  • когато получавате/задавате дати или времеви печати с JDBC, винаги използвайте параметъра Calendar, зададен на UTC:

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

  • Или синхронизирайте сървърите си с NTP, или разчитайте само на сървъра на базата данни, за да ви каже колко е часът.

Дългият отговор е следният:

Когато се занимавате с дати и часови зони във всяка база данни и с всеки клиентски код, обикновено препоръчвам следната политика:

  1. Конфигурирайте вашата база данни да използва 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 сутринта)!
  2. В кода на приложението си винаги използвайте UTC дати, освен когато показвате дати на потребителите си.

    • В Java, когато четете от базата данни, винаги използвайте:

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

    • Ако не направите това, ще се приеме, че времевата марка е във вашата местна часова зона, вместо UTC.
  3. Синхронизирайте сървърите си или разчитайте само на времето на сървъра на базата данни

    • Ако имате вашия уеб сървър на един сървър (или повече) и сървър на база данни на друг сървър, тогава силно препоръчвам да синхронизирате часовниците им с 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();

Надявам се това да помогне! :-)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL MAX_JOIN_SIZE грешки

  2. Проверете дали потребителското име съществува в таблицата на mysql чрез php?

  3. mysqld:Не мога да променя директорията в данни. Сървърът не се стартира

  4. Създаване на MySQL пространствена колона - Тип данни на точка с lat long без използване на таблицата Alter

  5. Има ли механизъм за деактивиране на вмъкване в таблица?