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?
- Java SE 8
, Java SE 9
, Java SE 10
, Java SE 11
, и по-късно - Част от стандартния Java API с пакетна реализация.
- Java 9 добавя някои незначителни функции и поправки.
- Java SE 6
и Java SE 7
- По-голямата част от java.time функционалността е обратно пренесена към Java 6 и 7 в ThreeTen-Backport .
- Android
- По-късни версии на пакетни реализации на Android на java.time класове.
- За по-ранен Android (<26), ThreeTenABP проектът адаптира ThreeTen-Backport (споменато по-горе). Вижте Как да използвате ThreeTenABP… .
ThreeTen-Extra
проект разширява java.time с допълнителни класове. Този проект е полигон за евентуални бъдещи допълнения към java.time. Тук може да намерите някои полезни класове като Интервал
, YearWeek
, YearQuarter
, и още
.