Zastanawiam się, czy istnieje sposób, aby uzyskać aktualne milisekund od 1-1-1970 (epoki), stosując nowe LocalDate
, LocalTime
lub LocalDateTime
klasy Java 8.
Znany sposób jest poniżej:
long currentMilliseconds = new Date().getTime();
lub
long currentMilliseconds = System.currentTimeMillis();
System.currentTimeMillis()
?currentTimeMillis
byłoby w tym kontekście nieistotne. Pomyśl Kalendarz + Zegar ścienny z naprawdę dobrą precyzją, bez obaw o strefy czasowe i lokalizację. Nie ma więc możliwości powrotu do „czasu UTC” z czasu lokalnegoOdpowiedzi:
Nie jestem do końca pewien, co rozumiesz przez „bieżące milisekundy”, ale założę, że jest to liczba milisekund od „epoki”, a mianowicie północy, 1 stycznia 1970 roku UTC.
Jeśli chcesz znaleźć liczbę milisekund od epoki teraz, a następnie użyć
System.currentTimeMillis()
jako Anubian Noob podkreślił . Jeśli tak, nie ma powodu, aby używać do tego nowych interfejsów API java.time.Być może jednak masz już
LocalDateTime
gdzieś podobny obiekt i chcesz go przekształcić w milisekundy od epoki. Nie można tego zrobić bezpośrednio, ponieważLocalDateTime
rodzina obiektów nie ma pojęcia, w której strefie czasowej się znajdują. W związku z tym należy podać informacje o strefie czasowej, aby znaleźć czas w stosunku do epoki, która jest w UTC.Załóżmy, że masz coś
LocalDateTime
takiego:Musisz zastosować informacje o strefie czasowej, podając
ZonedDateTime
. Jestem w tej samej strefie czasowej co Los Angeles, więc zrobiłbym coś takiego:Oczywiście przyjmuje to założenia dotyczące strefy czasowej. Są też przypadki skrajne, które mogą wystąpić, na przykład, jeśli lokalny czas nazywa czas w pobliżu przejścia na czas letni (czas letni). Odłóżmy je na bok, ale należy pamiętać, że takie przypadki istnieją.
W każdym razie, jeśli możesz uzyskać poprawny
ZonedDateTime
, możesz przekonwertować to na liczbę milisekund od epoki, tak jak poniżej:źródło
getEpochSecond
sposób (poprzez domyślnie ChronoZonedDateTime ). Nie ma potrzebyInstant
.ZonedDateTime
ma równieżInstant
ówgetNano
sposób, więc nie można po prostu wymienićinst
sięzdt
na swoim przykładzie?To, co robię, nie określam strefy czasowej,
daje
Jak widać liczby są takie same, z wyjątkiem krótkiego czasu wykonania.
Na wypadek gdybyś nie lubił System.currentTimeMillis, użyj
Instant.now().toEpochMilli()
źródło
Aby uniknąć ZoneId, możesz:
Otrzymanie 0 jako wartości, właśnie tak!
źródło
ZoneOffset.ofTotalSeconds(0)
jest taki sam jakZoneOffset.UTC
ZoneOffset
jest podklasąZoneId
, więc nie powiedziałbym, że jej unikałeś, ale dopóki jesteś szczęśliwy ...ZoneId
?Od wersji Java 8 możesz dzwonić
java.time.Instant.toEpochMilli()
.Na przykład połączenie
daje takie same wyniki jak
źródło
Możesz
java.sql.Timestamp
także użyć, aby uzyskać milisekundy.źródło
Timestamp
klasa jest od dawna przestarzała i pełna problemów projektowych, więc wolałbym jej unikać, szczególnie gdy możemy korzystać z klasjava.time
podobnychLocalDateTime
.Timestamp
, czy możesz podzielić się z tym jakimś artykułem? Pomaga mi to również uniknąć używaniaTimestamp
z mojego kodu. Dzięki!Date
ale często nie można go traktować jakoDate
. Większość metod odziedziczonych poDate
jednym konstruktorze jest przestarzała. JegotoString
metoda wykorzystuje strefę czasową maszyny JVM, która myli wiele, ponieważTimestamp
jest ona drukowana inaczej na różnych komputerach ( przykład ).LocalDate.of(year, month, day)
Aby uzyskać bieżący czas w milisekundach (od epoki), użyj
System.currentTimeMillis()
.źródło
Jeśli masz zegar Java 8, możesz go użyć
clock.millis()
(chociaż zaleca się,clock.instant()
aby uzyskać Instant Java 8, ponieważ jest dokładniejszy).Dlaczego miałbyś używać zegara Java 8? Tak więc w swoim środowisku DI możesz utworzyć komponent Clock Bean:
a następnie w swoich testach możesz łatwo Kpić:
lub możesz mieć inną fasolę:
co pomaga w testach, które niezmiernie potwierdzają daty i godziny.
źródło
źródło
Dlaczego nikt nie wspomniał o metodzie
LocalDateTime.toEpochSecond()
:Wydaje się to znacznie krótsze niż wiele sugerowanych odpowiedzi powyżej ...
źródło
toEpochMilli
metody, biorąc pod uwagę fakt, że można określić nawet nanosekundy w LocalDateTime: istnieje metodaLocalDateTime.of(int year, int month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond)
.