tl; dr
Projekt Joda-Time jest w trybie konserwacji, który został zastąpiony przez klasy java.time .
- Po prostu użyj
java.time.Instant
klasy.
- Nie ma potrzeby:
LocalDateTime
java.sql.Timestamp
- Smyczki
Uchwyć aktualny moment w UTC.
Instant.now()
Aby zapisać ten moment w bazie danych:
myPreparedStatement.setObject( … , Instant.now() ) // Writes an `Instant` to database.
Aby pobrać ten moment z bazy danych:
myResultSet.getObject( … , Instant.class ) // Instantiates a `Instant`
Aby ustawić zegar ścienny na czas w określonej strefie czasowej.
instant.atZone( z ) // Instantiates a `ZonedDateTime`
LocalDateTime
to zła klasa
Inne odpowiedzi są poprawne, ale nie wskazują, że LocalDateTime
jest to niewłaściwa klasa do twojego celu.
W obu java.time i Joda-Time , A LocalDateTime
celowo pozbawiony jakichkolwiek koncepcji strefy czasowej lub przesunięcia-from-UTC. W związku z tym nie reprezentuje momentu i nie jest punktem na osi czasu. A LocalDateTime
reprezentuje przybliżony pogląd potencjalnych momentach w zakresie około 26-27 godzin.
Użyj LocalDateTime
dla, gdy strefa / przesunięcie jest nieznane (nie jest to dobra sytuacja) lub gdy przesunięcie strefy jest nieokreślone. Na przykład „Boże Narodzenie zaczyna się od pierwszej chwili 25 grudnia 2018 r.” Będzie reprezentowane jako plikLocalDateTime
.
Użyj a, ZonedDateTime
aby przedstawić moment w określonej strefie czasowej. Na przykład Boże Narodzenie rozpoczynające się w określonej strefie, takiej jak Pacific/Auckland
lub America/Montreal
byłoby reprezentowane za pomocąZonedDateTime
obiekt.
Przez chwilę zawsze w UTC użyj Instant
.
Instant instant = Instant.now() ; // Capture the current moment in UTC.
Zastosuj strefę czasową. Ten sam moment, ten sam punkt na osi czasu, ale oglądany z innym czasem na zegarze ściennym.
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = instant.atZone( z ) ; // Same moment, different wall-clock time.
Tak więc, jeśli mogę po prostu przekonwertować między LocalDate i LocalDateTime,
Nie, zła strategia. Jeśli masz tylko wartość daty i chcesz mieć wartość daty i godziny, musisz określić godzinę. Ta pora dnia może nie obowiązywać w tym dniu dla określonej strefy - w takim przypadku ZonedDateTime
klasa automatycznie dostosowuje porę dnia w razie potrzeby.
LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 ) ;
LocalTime lt = LocalTime.of( 14 , 0 ) ; // 14:00 = 2 PM.
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;
Jeśli chcesz, aby pierwsza chwila dnia była Twoją porą dnia, pozwól java.time określić ten moment. Nie zakładaj, że dzień zaczyna się o 00:00:00. Anomalie, takie jak czas letni (DST), oznaczają, że dzień może zacząć się o innej godzinie, na przykład o godzinie 01:00:00.
ZonedDateTime zdt = ld.atStartOfDay( z ) ;
java.sql.Timestamp
to zła klasa
java.sql.Timestamp
Jest częścią kłopotliwych starych klas daty i godziny, które są teraz Legacy, supplanted całości przez java.time klas. Ta klasa była używana do reprezentowania momentu w UTC z rozdzielczością nanosekund . Temu celowi służy teraz java.time.Instant
.
JDBC 4.2 z getObject
/setObject
Począwszy od JDBC 4.2 i nowszych, sterownik JDBC może bezpośrednio wymieniać obiekty java.time z bazą danych, wywołując:
Na przykład:
myPreparedStatement.setObject( … , instant ) ;
… i …
Instant instant = myResultSet.getObject( … , Instant.class ) ;
Konwertuj starsze ⬌ nowoczesne
Jeśli musisz łączyć się ze starym kodem, który nie został jeszcze zaktualizowany do java.time , przekonwertuj tam iz powrotem, używając nowych metod dodanych do starych klas.
Instant instant = myJavaSqlTimestamp.toInstant() ; // Going from legacy class to modern class.
…i…
java.sql.Timestamp myJavaSqlTimestamp = java.sql.Timestamp.from( instant ) ; // Going from modern class to legacy class.
Informacje o java.time
Struktura java.time jest wbudowana w Javę 8 i nowsze. Klasy te kłopotliwe zastąpić stary starszych klas Date-Time, takich jak java.util.Date
, Calendar
, i SimpleDateFormat
.
Projekt Joda-Time , obecnie w trybie konserwacji , zaleca migrację do klas java.time .
Aby dowiedzieć się więcej, zobacz samouczek Oracle . I przeszukaj Stack Overflow, aby znaleźć wiele przykładów i wyjaśnień. Specyfikacja to JSR 310 .
Możesz wymieniać obiekty java.time bezpośrednio ze swoją bazą danych. Użyj sterownika JDBC zgodnego z JDBC 4.2 lub nowszym. Nie ma potrzeby stosowania ciągów ani java.sql.*
klas.
Skąd wziąć klasy java.time?
- Java SE 8 , Java SE 9 i nowsze
- Wbudowany.
- Część standardowego interfejsu API języka Java z dołączoną implementacją.
- Java 9 dodaje kilka drobnych funkcji i poprawek.
- Java SE 6 i Java SE 7
- Wiele funkcji java.time jest przenoszonych z powrotem do Java 6 i 7 w ThreeTen-Backport .
- Android
- Późniejsze wersje implementacji klas java.time w pakietach Androida.
- Dla wcześniejszej Androida (<26), ThreeTenABP projekt dostosowuje ThreeTen-backportu (jak wyżej). Zobacz Jak używać ThreeTenABP… .
Projekt ThreeTen-Extra rozszerza java.time o dodatkowe klasy. Ten projekt jest poligonem doświadczalnym dla ewentualnych przyszłych dodatków do java.time. Można znaleźć kilka przydatnych klas tutaj takie jak Interval
, YearWeek
, YearQuarter
, i więcej .
java.sql.Timestamp
klasa jest już starsza, wyparta przez klasy java.time , a konkretnie przezInstant
.