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.TimestampKlasa jest jedną z tych klas starszych. Nie jest już potrzebne. Zamiast tego użyj Instantlub innych klas java.time bezpośrednio z bazą danych przy użyciu JDBC 4.2 i nowszych.
InstantKlasa 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 ZoneIdobiekt. Określ prawidłową nazwę strefy czasowej w formacie continent/region, takie jak America/Montreal, Africa/Casablancalub Pacific/Auckland. Nigdy nie używaj 3-4-literowych pseudostref, takich jak ESTlub ISTponieważ nie są one prawdziwymi strefami czasowymi, nie znormalizowane, a nawet nie są unikalne (!).
ZoneId z = ZoneId.of( "America/Montreal" ) ;
Zastosuj do, Instantaby utworzyć ZonedDateTimeobiekt.
ZonedDateTime zdt = instant.atZone( z ) ;
Aby wygenerować ciąg do wyświetlenia użytkownikowi, przeszukaj Stack Overflow, DateTimeFormatteraby 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ć OffsetDateTimez 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 .