tl; dr
java.util.Date.from(
Instant.now() ;
)
Chociaż powyższy kod nie miał sensu. Obie java.util.Date
i Instant
reprezentują chwilę w UTC, zawsze w UTC. Powyższy kod ma taki sam skutek jak:
new java.util.Date()
Nie ma tu korzyści z używania ZonedDateTime
. Jeśli już masz ZonedDateTime
, dostosuj się do UTC, wyodrębniając plik Instant
.
java.util.Date.from(
myZonedDateTime.toInstant()
)
Prawidłowa inna odpowiedź
The Answer by ssoltanid poprawnie odnosi się do konkretnego pytania, jak przekonwertować obiekt java.time nowej szkoły ( ZonedDateTime
) na obiekt starej szkoły java.util.Date
. Wyodrębnij Instant
z ZonedDateTime i przejdź do java.util.Date.from()
.
Utrata danych
Zauważ, że będziesz cierpieć z powodu utraty danych , ponieważ Instant
śledzi nanosekundy od epoki, podczas gdy java.util.Date
śledzenie milisekund od epoki.
Twoje pytanie i komentarze rodzą inne problemy.
Zachowaj serwery w czasie UTC
Twoje serwery powinny mieć ustawiony system operacyjny hosta na UTC, co jest ogólnie najlepszą praktyką. JVM wybiera to ustawienie systemu operacyjnego hosta jako domyślną strefę czasową w implementacjach Java, o których wiem.
Określ strefę czasową
Jednak nigdy nie należy polegać na bieżącej domyślnej strefie czasowej maszyny JVM. Zamiast wybierać ustawienia hosta, flaga przekazywana podczas uruchamiania maszyny JVM może ustawić inną strefę czasową. Co gorsza: każdy kod w dowolnym wątku dowolnej aplikacji w dowolnym momencie może wywołać funkcję java.util.TimeZone::setDefault
zmiany tego ustawienia domyślnego w czasie wykonywania!
Cassandra Timestamp
Type
Każda przyzwoita baza danych i sterownik powinny automatycznie obsługiwać dostosowywanie przekazanej daty do czasu UTC do przechowywania. Nie używam Cassandry, ale wydaje się, że ma pewne podstawowe wsparcie dla daty i godziny. Dokumentacja podaje, że jego Timestamp
typ to liczba milisekund z tej samej epoki (pierwsza chwila 1970 roku czasu UTC).
ISO 8601
Ponadto Cassandra akceptuje ciągi wejściowe w standardowych formatach ISO 8601 . Na szczęście java.time używa formatów ISO 8601 jako domyślnych do analizowania / generowania ciągów. The Instant
class' toString
realizacja zrobi ładnie.
Precyzja: milisekunda vs nanosekord
Ale najpierw musimy zmniejszyć precyzję nanosekund ZonedDateTime do milisekund. Jednym ze sposobów jest utworzenie nowego Instant przy użyciu milisekund. Na szczęście java.time ma kilka przydatnych metod konwersji do iz milisekund.
Przykładowy kod
Oto przykładowy kod w Java 8 Update 60.
ZonedDateTime zdt = ZonedDateTime.now( ZoneId.of( "America/Montreal" ) );
…
Instant instant = zdt.toInstant();
Instant instantTruncatedToMilliseconds = Instant.ofEpochMilli( instant.toEpochMilli() );
String fodderForCassandra = instantTruncatedToMilliseconds.toString();
Lub zgodnie z tym dokumentem sterownika Cassandra Java , możesz przekazać java.util.Date
instancję (nie mylić z java.sqlDate
). Możesz więc utworzyć juDate z tego instantTruncatedToMilliseconds
w powyższym kodzie.
java.util.Date dateForCassandra = java.util.Date.from( instantTruncatedToMilliseconds );
Jeśli robisz to często, możesz stworzyć jedną linijkę.
java.util.Date dateForCassandra = java.util.Date.from( zdt.toInstant() );
Ale lepiej byłoby stworzyć małą metodę użytkową.
static public java.util.Date toJavaUtilDateFromZonedDateTime ( ZonedDateTime zdt ) {
Instant instant = zdt.toInstant();
java.util.Date utilDate = java.util.Date.from( instant ) ;
return utilDate;
}
Zwróć uwagę na różnicę w całym tym kodzie niż w pytaniu. Kod pytania próbował dostosować strefę czasową wystąpienia ZonedDateTime do UTC. Ale to nie jest konieczne. Koncepcyjnie:
ZonedDateTime = Instant + ZoneId
Po prostu wyodrębniamy część Instant, która jest już w UTC (zasadniczo w UTC, przeczytaj dokument klasy, aby uzyskać szczegółowe informacje).
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?
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.util.Date
ijava.sql.Date
.