tl; dr
Używaj tylko nowoczesnych klas java.time . Nigdy nie używaj straszne klas starszych, takich jak SimpleDateFormat
, Date
lub java.sql.Timestamp
.
ZonedDateTime // Represent a moment as perceived in the wall-clock time used by the people of a particular region ( a time zone).
.now( // Capture the current moment.
ZoneId.of( "Africa/Tunis" ) // Specify the time zone using proper Continent/Region name. Never use 3-4 character pseudo-zones such as PDT, EST, IST.
) // Returns a `ZonedDateTime` object.
.format( // Generate a `String` object containing text representing the value of our date-time object.
DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" )
) // Returns a `String`.
Możesz też użyć bieżącej domyślnej strefy czasowej maszyny JVM .
ZonedDateTime
.now( ZoneId.systemDefault() )
.format( DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" ) )
java.time i JDBC 4.2
Nowoczesne podejście wykorzystuje klasy java.time , jak pokazano powyżej.
Jeśli Twój sterownik JDBC jest zgodny z JDBC 4.2 , możesz bezpośrednio wymieniać obiekty java.time z bazą danych. Użyj PreparedStatement::setObject
i ResultSet::getObject
.
Używaj java.sql tylko dla sterowników starszych niż JDBC 4.2
Jeśli Twój sterownik JDBC nie jest jeszcze zgodny z JDBC 4.2 w zakresie obsługi typów java.time , musisz wrócić do używania klas java.sql.
Przechowywanie danych.
OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ; // Capture the current moment in UTC.
myPreparedStatement.setObject( … , odt ) ;
Pobieranie danych.
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
Typy java.sql, takie jak java.sql.Timestamp
, powinny być używane tylko do przesyłania do iz bazy danych. Natychmiast przekonwertuj na typy java.time w Javie 8 i nowszych.
java.time.Instant
Mapa java.sql.Timestamp
do java.time.Instant
chwili na osi czasu w UTC. Zwróć uwagę na nową metodę konwersji toInstant
dodaną do starej klasy.
java.sql.Timestamp ts = myResultSet.getTimestamp( … );
Instant instant = ts.toInstant();
Strefa czasowa
Zastosuj żądaną / oczekiwaną strefę czasową ( ZoneId
), aby uzyskać ZonedDateTime
.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
Sformatowane ciągi
Użyj a, DateTimeFormatter
aby wygenerować swój ciąg. Kody wzorców są podobne do tych z, java.text.SimpleDateFormat
ale nie do końca, więc przeczytaj uważnie dokumentację.
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" );
String output = zdt.format( formatter );
Ten konkretny format jest niejednoznaczny co do jego dokładnego znaczenia, ponieważ nie ma żadnego wskazania przesunięcia względem UTC lub strefy czasowej.
ISO 8601
Jeśli masz coś do powiedzenia w tej sprawie, proponuję rozważyć użycie standardowych formatów ISO 8601 zamiast tworzyć własne. Standardowy format jest dość podobny do twojego. Na przykład:
2016-02-20T03:26:32+05:30
.
Klasy java.time używają domyślnie tych standardowych formatów, więc nie ma potrzeby określania wzorca. ZonedDateTime
Klasa rozszerza standardowy format poprzez dołączenie nazwy strefy czasowej (mądry poprawę).
String output = zdt.toString(); // Example: 2007-12-03T10:15:30+01:00[Europe/Paris]
Konwertuj na java.sql
Możesz przekonwertować z java.time z powrotem na java.sql.Timestamp
. Wyodrębnij plik Instant
z ZonedDateTime
.
Nowe metody zostały dodane do starych klas, aby ułatwić konwersję do / z klas java.time.
java.sql.Timestamp ts = java.sql.Timestamp.from( zdt.toInstant() );
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 . Wyszukaj 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?
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 .