Mam epoch second i zoneId, według method1.Można go przekonwertować na LocalDateTime z domyślnym systemem zoneId, ale nie znajduję sposobu, aby przekonwertować sekundę epoki na LocalDateTime przez method2, ponieważ nie ma. ZoneOffset.systemDefault
Myślę, że jest to niejasne.
import java.time.{Instant, LocalDateTime, ZoneId, ZoneOffset}
val epochSecond = System.currentTimeMillis() / 1000
LocalDateTime.ofInstant(Instant.ofEpochSecond(epochSecond), ZoneId.systemDefault())//method1
LocalDateTime.ofEpochSecond(epochSecond, 0, ZoneOffset.MAX)//method2
import java.time.{Instant, LocalDateTime, ZoneId, ZoneOffset}
działał? Tounexpected token
dla mnie w Javie 11.java.time
tutaj: stackoverflow.com/a/56508200/145989Odpowiedzi:
Oto, jak możesz skorzystać
ZoneOffset
zZoneId
:Instant instant = Instant.now(); //can be LocalDateTime ZoneId systemZone = ZoneId.systemDefault(); // my timezone ZoneOffset currentOffsetForMyZone = systemZone.getRules().getOffset(instant);
Uwaga:
ZoneId
może mieć różne przesunięcia w zależności od czasu i historii danego miejsca. Tak więc wybranie różnych momentów spowoduje różne przesunięcia.NB2:
ZoneId.of()
może zwrócićZoneOffset
zamiast,ZoneId
jeśli przekazywany jestUTC+3
/GMT+2
/ etc, w przeciwieństwie do strefy czasowej, takiej jakAfrica/Cairo
. Więc jeśli przesunięcia UTC / GMT zostaną przekazane, informacje historyczne / geograficzne / dotyczące czasu letniegoInstant
nie będą brane pod uwagę - po prostu będziesz pracować z określonym przesunięciem.źródło
ZoneId.systemDefault()
w swoim kodzie i zwraca on różne strefy czasowe na różnych komputerach?Nie ma mapowania jeden do jednego. ZoneId definiuje zasięg geograficzny, w którym zestaw różnych ZoneOffsets jest używany w czasie. Jeśli strefa czasowa korzysta z czasu letniego, jej ustawienie ZoneOffset będzie inne w okresie letnim i zimowym.
Co więcej, zasady dotyczące czasu letniego mogły się zmieniać w czasie, więc ZoneOffset może być inna np. 13/10/2015 w porównaniu z 13/10/1980.
Więc możesz znaleźć ZoneOffset dla ZoneId w konkretnym Instant.
Zobacz także https://en.wikipedia.org/wiki/Tz_database
źródło
tl; dr
ZonedDateTime.now( ZoneId.of( "America/Montreal" ) )
… Bieżącej domyślnej strefy czasowej…
Detale
Odpowiedz przez Stanislav Bshkyrtsev prawidłowo i bezpośrednio odpowiada na Twoje pytanie.
Istnieją jednak większe problemy, jak sugeruje odpowiedź Jona Skeeta .
LocalDateTime
LocalDateTime
celowo nie ma pojęcia strefy czasowej ani przesunięcia względem czasu UTC. Mało prawdopodobne, czego chcesz.Local…
Oznacza dowolną lokalizację, a nie któregokolwiek konkretnym obszarze. Ta klasa nie przedstawia momentu, a jedynie potencjalne momenty w zakresie około 26-27 godzin (zakres stref czasowych na całym świecie).Instant
Nie musisz zaczynać od sekund epoki, jeśli próbujesz uzyskać aktualny czas. Pobierz aktualny
Instant
.Instant
Klasa reprezentuje moment na osi czasu w UTC z rozdzielczością nanosekund (do dziewięciu (9) cyfr ułamka dziesiętnego).Wewnątrz tego
Instant
jest liczba nanosekund -od-epoki. Ale tak naprawdę nas to nie obchodzi.ZonedDateTime
Jeśli chcesz zobaczyć ten moment przez pryzmat zegara ściennego określonego regionu, zastosuj a,
ZoneId
aby uzyskaćZonedDateTime
.ZoneId z = ZoneId.of( "Europe/Paris" ); ZonedDateTime zdt = instant.atZone( z );
Jako skrót możesz zrobić bezpośrednio do
ZonedDateTime
.A
ZonedDateTime
maInstant
w sobie. Zadzwoń,zdt.toInstant()
aby uzyskać ten sam moment jako podstawową wartość w UTC . Taka sama liczba nanosekund od epoki w obu przypadkach, jako aZonedDateTime
lub jakoInstant
.Podane sekundy od epoki
Jeśli podana jest liczba sekund od epoki, a epoka jest pierwszą chwilą roku 1970 w UTC (
1970-01-01T00:00:00Z
), podaj tę liczbę doInstant
.long secondsSinceEpoch = 1_484_063_246L ; Instant instant = Instant.ofEpochSecond( secondsSinceEpoch ) ;
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
.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 .
Projekt Joda-Time , obecnie w trybie konserwacji , zaleca migrację do klas java.time .
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
Jak mówi dokumentacja : „Jest to przeznaczone głównie do konwersji niskiego poziomu, a nie do ogólnego wykorzystania aplikacji”.
Przejście przez
Instant
ma dla mnie sens - twoja sekunda epoki jest właściwie inną reprezentacją anInstant
, więc przekonwertuj ją na an,Instant
a następnie przekonwertuj ją na określoną strefę czasową.źródło
Mam nadzieję, że pierwsze dwie linijki mojego rozwiązania poniżej są pomocne. Mój problem polegał na tym, że miałem
LocalDateTime
i nazwę strefy czasowej i potrzebowałem,instant
aby móc zbudowaćjava.util.Date
, ponieważ tego chciał MongoDB. Mój kod to Scala, ale tutaj jest tak blisko Java, że myślę, że nie powinno być problemu ze zrozumieniem go:val zid = ZoneId.of(tzName) // "America/Los_Angeles" val zo: ZoneOffset = zid.getRules.getOffset(localDateTime) // ⇒ -07:00 // 2017-03-16T18:03 val odt = OffsetDateTime.of(localDateTime, zo) // ⇒ 2017-03-16T18:03:00-07:00 val instant = odt.toInstant // ⇒ 2017-03-17T01:03:00Z val issued = Date.from(instant)
źródło
Poniższe zwraca ilość czasu w milisekundach, jaki należy dodać do czasu UTC, aby uzyskać standardowy czas w tej strefie czasowej:
TimeZone.getTimeZone(ZoneId.of("Europe/Amsterdam")).getRawOffset()
źródło
ZonedDateTime
z epoki sekund i Id strefyZoneOffset
fromZonedDateTime
Próbny:
import java.time.Instant; import java.time.ZoneId; import java.time.ZoneOffset; import java.time.ZonedDateTime; public class Main { public static void main(String[] args) { // Get ZonedDateTime from epoch second and Zone Id ZonedDateTime zdt = Instant.ofEpochSecond(1597615462L).atZone(ZoneId.of("Europe/London")); // Get ZoneOffset from ZonedDateTime ZoneOffset offset = zdt.getOffset(); System.out.println(offset); } }
Wynik:
+01:00
źródło