java.time
Nowoczesne podejście wykorzystuje klasy java.time , które wyparły kłopotliwe starsze klasy daty i czasu, zawarte w najwcześniejszych wersjach Javy.
java.sql.Timestamp
Klasa jest jedną z tych klas starszych. Nie jest już potrzebne. Zamiast tego użyj Instant
lub innych klas java.time bezpośrednio z bazą danych przy użyciu JDBC 4.2 i nowszych.
Instant
Klasa reprezentuje moment na osi czasu w UTC z rozdzielczością nanosekund (do dziewięciu (9) cyfr ułamka dziesiętnego).
Instant instant = myResultSet.getObject( … , Instant.class ) ;
Jeśli musisz współdziałać z istniejącą Timestamp
, natychmiast przekonwertuj ją na java.time za pomocą nowych metod konwersji dodanych do starych klas.
Instant instant = myTimestamp.toInstant() ;
Aby dostosować się do innej strefy czasowej, określ strefę czasową jako ZoneId
obiekt. Określ prawidłową nazwę strefy czasowej w formacie continent/region
, takie jak America/Montreal
, Africa/Casablanca
lub Pacific/Auckland
. Nigdy nie używaj 3-4-literowych pseudostref, takich jak EST
lub IST
ponieważ nie są one prawdziwymi strefami czasowymi, nie znormalizowane, a nawet nie są unikalne (!).
ZoneId z = ZoneId.of( "America/Montreal" ) ;
Zastosuj do, Instant
aby utworzyć ZonedDateTime
obiekt.
ZonedDateTime zdt = instant.atZone( z ) ;
Aby wygenerować ciąg do wyświetlenia użytkownikowi, przeszukaj Stack Overflow, DateTimeFormatter
aby znaleźć wiele dyskusji i przykładów.
Twoje pytanie tak naprawdę dotyczy pójścia w innym kierunku, od wprowadzania danych użytkownika do obiektów daty i czasu. Ogólnie najlepiej jest podzielić wprowadzanie danych na dwie części, datę i godzinę.
LocalDate ld = LocalDate.parse( dateInput , DateTimeFormatter.ofPattern( "M/d/uuuu" , Locale.US ) ) ;
LocalTime lt = LocalTime.parse( timeInput , DateTimeFormatter.ofPattern( "H:m a" , Locale.US ) ) ;
Twoje pytanie nie jest jasne. Czy chcesz interpretować datę i godzinę wprowadzoną przez użytkownika jako czas UTC? Albo w innej strefie czasowej?
Jeśli masz na myśli UTC, stworzyć OffsetDateTime
z przesunięciem za pomocą stałej za UTC ZoneOffset.UTC
.
OffsetDateTime odt = OffsetDateTime.of( ld , lt , ZoneOffset.UTC ) ;
Jeśli masz na myśli inną strefę czasową, połącz razem z obiektem strefy czasowej, a ZoneId
. Ale która strefa czasowa? Możesz wykryć domyślną strefę czasową. Lub, jeśli jest to krytyczne, musisz potwierdzić z użytkownikiem, aby mieć pewność co do jego zamiaru.
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;
Aby uzyskać prostszy obiekt, który z definicji zawsze znajduje się w UTC, wyodrębnij plik Instant
.
Instant instant = odt.toInstant() ;
…lub…
Instant instant = zdt.toInstant() ;
Wyślij do swojej bazy danych.
myPreparedStatement.setObject( … , instant ) ;
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
, iSimpleDateFormat
.
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 .
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.
- Na wcześniejszym Androidzie ThreeTenABP projekt dostosowuje ThreeTen-backportu (wymienione powyż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 .