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

JPA Запазване на грешна дата в MySQL база данни

tl;dr

Използвайте JPA 2.2 за поддръжката на java.time .

Използвайте клас само за дата в Java, за да работите със стойности само за дата в SQL.

LocalDate                           // Represent a date-only, without a time-of-day and without a time zone.
.now(                               // Get today's date…
    ZoneId.of( "Africa/Tunis" )     // …as seen in the wall-clock time used by the people of a particular region.
)                                   // Returns a `LocalDate` object.
.plusMonths( 1 )                    // Returns another `LocalDate` object, per immutable objects pattern.

java.time

JPA 2.2 сега поддържа модерния java.time класове. Вече няма нужда да използвате Joda-Time.

Не използвайте java.sql.Date . Този клас преструва се да представлява само дата, но всъщност има време на деня, зададено на UTC поради ужасното дизайнерско решение да се наследи от java.util.Date (което въпреки името представлява дата и време на деня и отместване от нула за самото UTC). Тези наследени класове са ужасна окаяна бъркотия. Sun, Oracle и JCP общността се отказаха от курсовете по тези преди години с приемането на JSR 310, както и вие.

LocalDate

LocalDate клас представлява стойност само за дата без време на деня и без часова зона или offset-from-UTC .

Часовата зона е от решаващо значение при определянето на дата. За всеки даден момент датата варира по земното кълбо по зона. Например няколко минути след полунощ в Париж Франция е нов ден, докато все още е „вчера“ в Монреал, Квебек .

Ако не е посочена часова зона, JVM имплицитно прилага текущата си часова зона по подразбиране. Това подразбиране може да промяна по всяко време по време на изпълнение(!), така че резултатите ви може да варират. По-добре е да посочите изрично желаната/очакваната часова зона като аргумент. Ако е критично, потвърдете зоната с вашия потребител.

Посочете правилно име на часова зона във формат Континент/Регион , като Америка/Монреал , Африка/Казабланка , или Тихоокеански/Окланд . Никога не използвайте съкращението от 2-4 букви като EST или IST тъй като те не истински часови зони, нестандартизирани и дори не уникални(!).

ZoneId z = ZoneId.of( "America/Montreal" ) ;  
LocalDate today = LocalDate.now( z ) ;

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

ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.

Или посочете дата. Можете да зададете месеца с число, с нормална номерация 1-12 за януари-декември.

LocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ;  // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.

Или по-добре използвайте Месец enum обекти предварително дефинирани, по един за всеки месец от годината. Съвет:Използвайте тези Месец обекти в цялата ви кодова база, а не просто цяло число, за да направите кода си по-самодокументиращ, да осигурите валидни стойности и да предоставите тип-безопасност . Същото за Година &YearMonth .

LocalDate ld = LocalDate.of( 1986 , Month.FEBRUARY , 23 ) ;

Математика дата-час

Очевидно искате да започнете с една дата и да получите един месец по-късно като период от време.

LocalDate monthLater = ld.plusMonths( 1 ) ;

JDBC 4.2

От JDBC 4.2 се изисква вашият JDBC драйвер да поддържа някои от ключовите java.time класове като LocalDate .

Период от време

Обърнете внимание на връзките по-долу за ThreeTen-Extra . Може да намерите LocalDateRange клас там, за да бъде удобен, ако вършите много работа с периоди от време.

Относно java.time

java.time рамката е вградена в Java 8 и по-нови версии. Тези класове заменят обезпокоителното старо наследство класове дата-време като java. util.Date , Календар , &SimpleDateFormat .

За да научите повече, вижте Урок за Oracle . И потърсете Stack Overflow за много примери и обяснения. Спецификацията е JSR 310 .

Joda-Time проект, сега в режим на поддръжка , препоръчва миграция към java.time класове.

Можете да обменяте java.time обекти директно с вашата база данни. Използвайте JDBC драйвер съвместим с JDBC 4.2 или по-късно. Няма нужда от низове, няма нужда от java.sql.* класове.

Къде да получа класовете java.time?

ThreeTen-Extra проект разширява java.time с допълнителни класове. Този проект е полигон за евентуални бъдещи допълнения към java.time. Тук може да намерите някои полезни класове като Интервал , YearWeek , YearQuarter , и още .



  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 MONTH() да използва водещи нули?

  2. Изберете от таблица, където полетата не отговарят на условията

  3. Mysql заявка за динамично преобразуване на редове в колони

  4. Вземете последния отделен набор от записи

  5. грешка 1265. Данните са съкратени за колона при опит за зареждане на данни от txt файл