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

JPA TemporalType.Date дава грешна дата

Много съжалявам, но всички отговори досега са като цяло неверни. Отговорът е доста прост, но изисква да разделим пет точки:

  1. ДАТА =java.sql.Date, която е обвивка около java.util.Date, която е броят на милисекунди от епохата в часовата зона UTC. Така че това има година/месец/дата/часове/минути/секунди във фиксирана часова зона GMT+0 (UTC). Обърнете внимание обаче, че java.sql.Date настройва часовите компоненти на нула!
  2. TIMESTAMP =java.sql.TimeStamp, който е обвивка на компонент около Date, която добавя части от секунди, за да поддържа стандарта за SQL DATE. Този клас/тип не е подходящ или е необходим за този въпрос, но накратко има датата плюс часа.
  3. Базата данни съхранява обекти DATE, както са дефинирани (използвайки UTC като отместване от Java), но може преведете времето, ако е конфигурирано в базата данни да бъде в различна часова зона. По подразбиране повечето бази данни по подразбиране са към часовата зона на локалния сървър, което е много лоша идея. Дами, господа... ВИНАГИ съхранявайте обекти DATE в UTC. Прочетете...
  4. Часът в JVM и часовата зона трябва да са правилни. Тъй като обектът Date използва UTC, изчислява ли се изместване за времето на сървъра ви? Имайте предвид това със силната препоръка времето на сървъра да бъде настроено на GMT+0 (UTC).
  5. Накрая, когато искаме да изобразим DATE от базата данни (с помощта на JSF или каквото и да е), това трябва да бъде настроен да бъде GMT+0 часова зона и, ако се прави от горната страна на сървъра също ... вашите дати и часове ВИНАГИ ще бъдат последователни, референтни и всички добри неща. Всичко, което остава, е да изобрази времето и ТОВА е мястото, където потребителският агент (за уеб приложение например) може да се използва за превеждане на GMT+0 часа към „локалната“ часова зона на потребителите.

Резюме:Използвайте UTC (GMT+0) на сървъра, в базата данни, във вашите Java обекти.

DATE и TIMESTAMP се различават само от гледна точка на базата данни по това, че TIMESTAMP носи допълнителни части от секунди. И двете използват GMT+0 (подразбиращо се). JodaTime е предпочитана календарна рамка за справяне с всичко това, но няма да реши проблемите с несъответствието на JVM с настройките на часовата зона на базата данни.

Ако дизайните на приложения от JVM до DB не използват GMT, поради лятно часово време, настройки на часовника и всякакви други регионални игри, които се играят в световните местни часовници ... времената на транзакциите и всичко останало ще бъдат завинаги изкривени , нереферентни, непоследователни и др.

Друг добър свързан отговор за типовете данни:java.util .Дата срещу java.sql.Date

Също така имайте предвид, че Java 8 има актуализации с по-добра обработка на дата/час (най-накрая), но това не коригира часовника на сървъра, на който работи JVM, да е в една часова зона, а базата данни да е в друга. В този момент винаги има превод. Във всеки голям (интелигентен) клиент, с който работя, часовите зони на базата данни и JVM сървъра са настроени на UTC точно поради тази причина, дори ако операциите им се извършват до голяма степен в друга часова зона.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Пребройте броя на появяванията на низ в поле VARCHAR?

  2. Агрегираните MySQL функции винаги ли връщат един ред?

  3. $PATH не се запазва, след като напусна терминала

  4. Вмъкване след съкращаване започва от 1; но вмъкване след изтриване се възобновява от предишната стойност

  5. MYSQL REGEXP търсене в JSON низ