tl;dr
Použít JPA 2.2 za podporu java.time .
Pro práci s hodnotami pouze pro datum v SQL použijte v jazyce Java třídu pouze pro datum.
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 nyní podporuje moderní java.time třídy. Již není třeba používat Joda-Time.
Ne ne použijte java.sql.Date
. Tato třída předstírá reprezentovat pouze datum, ale ve skutečnosti má denní dobu nastavenou na UTC kvůli hroznému rozhodnutí o návrhu dědit z java.util.Date
(který navzdory názvu představuje datum a denní dobu a offset nuly pro samotné UTC). Tyto starší třídy jsou hrozný ubohý nepořádek. Sun, Oracle a komunita JCP se vzdali kurzů diplomových prací před lety s přijetím JSR 310 a vy byste také měli.
LocalDate
LocalDate
class představuje hodnotu pouze pro datum bez času dne a bez časového pásma
nebo offset-from-UTC
.
Časové pásmo je rozhodující pro určení data. Pro každý daný okamžik se datum na zeměkouli liší podle zóny. Například několik minut po půlnoci v Paříž ve Francii je nový den a přitom ještě „včera“ v Montréal Québec .
Pokud není zadáno žádné časové pásmo, JVM implicitně použije své aktuální výchozí časové pásmo. Toto výchozí nastavení může změnit kdykoli během běhu(!), takže vaše výsledky se mohou lišit. Je lepší zadat požadované/očekávané časové pásmo explicitně jako argument. Pokud je to kritické, potvrďte zónu u svého uživatele.
Zadejte správný název časového pásma
ve formátu Continent/Region
, jako je America/Montreal
, Africa/Casablanca
nebo Pacific/Auckland
. Nikdy nepoužívejte 2-4písmennou zkratku jako EST
nebo IST
protože nejsou skutečná časová pásma, nestandardizovaná a dokonce ani jedinečná(!).
ZoneId z = ZoneId.of( "America/Montreal" ) ;
LocalDate today = LocalDate.now( z ) ;
Pokud chcete použít aktuální výchozí časové pásmo JVM, požádejte o něj a předejte jej jako argument. Pokud je vynechán, kód se čte nejednoznačně, takže s jistotou nevíme, zda jste zamýšleli použít výchozí nastavení, nebo zda jste, jako mnoho programátorů, o problému nevěděli.
ZoneId z = ZoneId.systemDefault() ; // Get JVM’s current default time zone.
Nebo uveďte datum. Měsíc můžete nastavit číslem, s rozumným číslováním 1-12 pro leden až prosinec.
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.
Nebo, lépe, použijte Month
enum objekty předdefinované, jeden pro každý měsíc v roce. Tip:Použijte tyto Month
objekty v celé vaší kódové základně spíše než pouhé celé číslo, aby se váš kód více sám dokumentoval, zajistil platné hodnoty a poskytl typová bezpečnost
. Stejně jako pro Year
&YearMonth
.
LocalDate ld = LocalDate.of( 1986 , Month.FEBRUARY , 23 ) ;
Matematika data a času
Zřejmě chcete začít s jedním datem a získat o měsíc později jako časové období.
LocalDate monthLater = ld.plusMonths( 1 ) ;
JDBC 4.2
Od verze JDBC 4.2 musí váš ovladač JDBC podporovat některé z klíčů java.time třídy, jako je LocalDate
.
Časové období
Všimněte si níže uvedených odkazů pro ThreeTen-Extra . Můžete najít LocalDateRange
třída, která se vám bude hodit, pokud hodně pracujete s rozsahy dat.
O java.time
java.time
framework je zabudován do Javy 8 a novější. Tyto třídy nahrazují staré problematické dědictví
třídy podle data a času, jako je java.util.Date
, Calendar
, &SimpleDateFormat
.
Další informace naleznete v Výukovém programu Oracle . A hledejte Stack Overflow pro mnoho příkladů a vysvětlení. Specifikace je JSR 310 .
Čas Joda projekt, nyní v režimu údržby , doporučuje migraci na java.time třídy.
Můžete si vyměnit java.time objektů přímo s vaší databází. Použijte ovladač JDBC
v souladu s JDBC 4.2
nebo později. Není potřeba řetězců, není potřeba java.sql.*
třídy.
Kde získat třídy java.time?
- Java SE 8
, Java SE 9
, Java SE 10
, Java SE 11
a novější - Část standardního Java API s implementací v balíčku.
- Java 9 přidává některé drobné funkce a opravy.
- Java SE 6
a Java SE 7
- Většina z java.time funkčnost je zpětně portována na Java 6 a 7 v ThreeTen-Backport .
- Android
- Pozdější verze implementací balíčku java.time pro Android třídy.
- Pro starší Android (<26), ThreeTenABP projekt přizpůsobuje ThreeTen-Backport (zmíněno výše). Viz Jak používat ThreeTenABP… .
The ThreeTen-Extra
projekt rozšiřuje java.time o další třídy. Tento projekt je zkušební půdou pro možná budoucí rozšíření java.time. Zde můžete najít některé užitečné třídy, jako je Interval
, YearWeek
, YearQuarter
a další
.