sql >> Database teknologi >  >> RDS >> Mysql

JPA Gemmer forkert dato i MySQL-databasen

tl;dr

Brug JPA 2.2 for sin støtte til java.time .

Brug en kun dato-klasse i Java til at arbejde med kun dato-værdier i 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 understøtter nu den moderne java.time klasser. Det er ikke nødvendigt at bruge Joda-Time længere.

Gør det ikke brug java.sql.Date . Den klasse lader som om repræsenterer kun en dato, men har faktisk et klokkeslæt sat til UTC på grund af den frygtelige designbeslutning om at arve fra java.util.Date (som trods navnet repræsenterer en dato og et tidspunkt på dagen og en offset på nul for selve UTC). Disse gamle klasser er et forfærdeligt elendigt rod. Sun, Oracle og JCP-fællesskabet opgav alle med specialetimerne for år siden med vedtagelsen af ​​JSR 310, og det burde du også.

LocalDate

LocalDate klasse repræsenterer en kun datoværdi uden tidspunkt på dagen og uden tidszone eller offset-from-UTC .

En tidszone er afgørende for at bestemme en dato. For ethvert givet øjeblik varierer datoen rundt om i verden efter zone. For eksempel et par minutter efter midnat i Paris Frankrig er en ny dag, mens det stadig er "i går" i Montréal Québec .

Hvis der ikke er angivet nogen tidszone, anvender JVM implicit sin nuværende standardtidszone. Denne standard kan ændre til enhver tid under runtime(!), så dine resultater kan variere. Bedre at specificere din ønskede/forventede tidszone eksplicit som et argument. Hvis det er kritisk, skal du bekræfte zonen med din bruger.

Angiv et korrekt tidszonenavn i formatet Kontinent/Region , såsom America/Montreal , Afrika/Casablanca , eller Pacific/Auckland . Brug aldrig forkortelsen på 2-4 bogstaver såsom EST eller IST som de ikke er sande tidszoner, ikke standardiserede, og ikke engang unikke(!).

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

Hvis du vil bruge JVM's nuværende standardtidszone, skal du bede om det og sende det som et argument. Hvis den udelades, bliver koden tvetydig at læse i, at vi ikke ved med sikkerhed, om du havde til hensigt at bruge standarden, eller om du, som så mange programmører, ikke var klar over problemet.

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

Eller angiv en dato. Du kan indstille måneden med et tal, med fornuftige nummer 1-12 for januar-december.

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.

Eller bedre, brug Måned enum-objekter foruddefinerede, et for hver måned i året. Tip:Brug disse Måned objekter i hele din kodebase i stedet for et helt tal for at gøre din kode mere selvdokumenterende, sikre gyldige værdier og give typesikkerhed . Ditto for År &YearMonth .

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

Dato-tid matematik

Du vil åbenbart starte med én dato og få en måned senere som et datointerval.

LocalDate monthLater = ld.plusMonths( 1 ) ;

JDBC 4.2

Fra JDBC 4.2 skal din JDBC-driver understøtte nogle af nøglerne java.time klasser såsom LocalDate .

Datointerval

Bemærk nedenstående links til ThreeTen-Extra . Du kan muligvis finde LocalDateRange klasse der for at være praktisk, hvis du arbejder meget med datointervaller.

Om java.time

java.time framework er indbygget i Java 8 og nyere. Disse klasser erstatter den besværlige gamle arv dato-tidsklasser såsom java. util.Dato , Kalender , &SimpleDateFormat .

For at lære mere, se Oracle Tutorial . Og søg i Stack Overflow for mange eksempler og forklaringer. Specifikationen er JSR 310 .

Joda-Time projekt, nu i vedligeholdelsestilstand , anbefaler migrering til java.time klasser.

Du kan udveksle java.time objekter direkte med din database. Brug en JDBC-driver kompatibel med JDBC 4.2 eller senere. Intet behov for strenge, intet behov for java.sql.* klasser.

Hvor får man java.time klasserne?

ThreeTen-Extra projekt udvider java.time med yderligere klasser. Dette projekt er et bevisgrundlag for mulige fremtidige tilføjelser til java.time. Du kan finde nogle nyttige klasser her, såsom Interval , Årsuge , YearQuarter , og mere .



  1. Hvorfor bruges der ingen nøgler i denne EXPLAIN?

  2. MySQL ORDER BY DESC er hurtig, men ASC er meget langsom

  3. $filter virker ikke i JPA/Olingo 2.0.11 med MySQL

  4. MYSQL hvordan man låser tabel op, hvis jeg brugte kommandoen LOCK table table_name WRITE;