Używam JodaTime 1.6.2.
Mam element, LocalDate
który muszę przekonwertować na (Joda) LocalDateTime
lub a java.sqlTimestamp
for ormapping.
Powodem tego jest to, że odkryłem, jak przekonwertować między a LocalDateTime
i a java.sql.Timestamp
:
LocalDateTime ldt = new LocalDateTime();
DateTimeFormatter dtf = DateTimeFormatter.forPattern("yyyy-MM-dd HH:mm:ss");
Timestamp ts = Timestamp.valueOf(ldt.toString(dtf));
Tak więc, jeśli mogę po prostu przekonwertować między LocalDate
i LocalDateTime
, mogę kontynuować konwersję do formatu java.sql.Timestamp
. Dziękujemy za wszelkie działania we właściwym kierunku!
java.sql.Timestamp
klasa jest już starsza, wyparta przez klasy java.time , a konkretnie przezInstant
.Odpowiedzi:
JodaTime
Aby przekonwertować JodaTime na
org.joda.time.LocalDate
celujava.sql.Timestamp
, po prostu zróbAby przekonwertować JodaTime na
org.joda.time.LocalDateTime
celujava.sql.Timestamp
, po prostu zróbJavaTime
Aby przekonwertować Java8 na
java.time.LocalDate
celujava.sql.Timestamp
, po prostu zróbAby przekonwertować Java8 na
java.time.LocalDateTime
celujava.sql.Timestamp
, po prostu zróbźródło
LocalDateTime
na,DateTime
ponieważ nie wszystkieLocalDateTime
s są prawidłoweDateTime
. Źródło: joda-time.sourceforge.net/faq.html#illegalinstant i właśnie w to wpadam .Timestamp#valueOf()
metoda akceptuje, ponieważ Java SE 1.8 również aLocalDateTime
.Najlepszy sposób na wykorzystanie czasu API Java 8:
Do użytku z JPA umieszczonym w modelu ( https://weblogs.java.net/blog/montanajava/archive/2014/06/17/using-java-8-datetime-classes-jpa ):
Więc teraz jest to względny czas niezależny od strefy czasowej. Dodatkowo jest to łatwe:
Formatowanie:
UPDATE: postgres 9.4.1208, HSQLDB 2.4.0 itd. Rozumieją Java 8 Time API bez żadnych rozmów!
źródło
tl; dr
Projekt Joda-Time jest w trybie konserwacji, który został zastąpiony przez klasy java.time .
java.time.Instant
klasy.LocalDateTime
java.sql.Timestamp
Uchwyć aktualny moment w UTC.
Aby zapisać ten moment w bazie danych:
Aby pobrać ten moment z bazy danych:
Aby ustawić zegar ścienny na czas w określonej strefie czasowej.
LocalDateTime
to zła klasaInne odpowiedzi są poprawne, ale nie wskazują, że
LocalDateTime
jest to niewłaściwa klasa do twojego celu.W obu java.time i Joda-Time , A
LocalDateTime
celowo 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. ALocalDateTime
reprezentuje przybliżony pogląd potencjalnych momentach w zakresie około 26-27 godzin.Użyj
LocalDateTime
dla, 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,
ZonedDateTime
aby przedstawić moment w określonej strefie czasowej. Na przykład Boże Narodzenie rozpoczynające się w określonej strefie, takiej jakPacific/Auckland
lubAmerica/Montreal
byłoby reprezentowane za pomocąZonedDateTime
obiekt.Przez chwilę zawsze w UTC użyj
Instant
.Zastosuj strefę czasową. Ten sam moment, ten sam punkt na osi czasu, ale oglądany z innym czasem na zegarze ściennym.
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
ZonedDateTime
klasa automatycznie dostosowuje porę dnia w razie potrzeby.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.
java.sql.Timestamp
to zła klasajava.sql.Timestamp
Jest 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 terazjava.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:
PreparedStatement::setObject
ResultSet::getObject
Na przykład:
… i …
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.
…i…
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 .
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 .źródło
W zależności od strefy czasowej możesz stracić kilka minut (1650-01-01 00:00:00 staje się 1649-12-31 23:52:58)
Użyj poniższego kodu, aby tego uniknąć
źródło
Ponieważ Joda staje się wyblakły, ktoś może chcieć przekonwertować
LocaltDate
goLocalDateTime
na Javę 8. W Javie 8LocalDateTime
da to możliwość stworzeniaLocalDateTime
instancji przy użyciuLocalDate
iLocalTime
. Sprawdź tutaj.Próbka byłaby:
Tylko w celach informacyjnych, aby uzyskać poniżej epokowe sekundy, można użyć
źródło
LocalDateTime
W ogóle nie ma potrzeby używania tutaj. Ta klasa celowo nie ma pojęcia strefy czasowej ani przesunięcia względem czasu UTC. Więc nie służy to tutaj żadnemu użytecznemu celowi. Zamiast tego:LocalDate.parse( “20180306” , DateTimeFormatter.BASIC_ISO_DATE ).atStartOfDay( ZoneId.of( “Africa/Tunis” ).toEpochSecond()
nie zakładaj, że dzień zaczyna się o godzinie 00:00, nie zawsze tak jest.java.time.LocalDate.atStartOfDay
plikZonedDateTime
. Zobacz przykłady w mojej odpowiedzi . Jak już wspomniałem,LocalDateTime
zajęcia są w tym wszystkim bezużyteczne i przynoszą skutki odwrotne do zamierzonych.LocalDateTime
musimy użyćZoneId
?LocalDateTime
jest nie odpowiednie do problemu pod ręką tutaj.LocalDateTime
Sposób nie reprezentują chwilę. A nieLocalDateTime
ma nic wspólnego z konkretną lokalizacją lub strefą czasową, chociaż na pierwszy rzut oka nazwa może sugerować inaczej - dowiedz się więcej o zamiarze i szczegółach tej klasy.LocalDateTime
Klasa ma służyć jakiemuś celowi, ale nie cel widział w tej kwestii.wywołanie funkcji
asStartOfDay()
najava.time.LocalDate
obiekcie zwracajava.time.LocalDateTime
obiektźródło
Java8 +
źródło