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?
- Java SE 8
, Java SE 9
, Java SE 10
, Java SE 11
, og senere - En del af standard Java API med en bundtet implementering.
- Java 9 tilføjer nogle mindre funktioner og rettelser.
- Java SE 6
og Java SE 7
- Det meste af java.time funktionalitet er back-porteret til Java 6 &7 i ThreeTen-Backport .
- Android
- Senere versioner af Android-bundtimplementeringer af java.time klasser.
- For tidligere Android (<26), ThreeTenABP projektet tilpasser ThreeTen-Backport (nævnt ovenfor). Se Sådan bruger du ThreeTenABP... .
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
.