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 LocalDateTimejest to niewłaściwa klasa do twojego celu.
W obu java.time i Joda-Time , A LocalDateTimecelowo 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 LocalDateTimereprezentuje przybliżony pogląd potencjalnych momentach w zakresie około 26-27 godzin.
Użyj LocalDateTimedla, 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, ZonedDateTimeaby przedstawić moment w określonej strefie czasowej. Na przykład Boże Narodzenie rozpoczynające się w określonej strefie, takiej jak Pacific/Aucklandlub America/Montrealbył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 ZonedDateTimeklasa 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.TimestampJest 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.Timestampklasa jest już starsza, wyparta przez klasy java.time , a konkretnie przezInstant.