Jak wyodrębnić wartość epoki Long
z wystąpień LocalDateTime
lub LocalDate
? Wypróbowałem następujące, ale daje mi to inne wyniki:
LocalDateTime time = LocalDateTime.parse("04.02.2014 19:51:01", DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss"));
System.out.println(time.getLong(ChronoField.SECOND_OF_DAY)); // gives 71461
System.out.println(time.getLong(ChronoField.EPOCH_DAY)); // gives 16105
To, czego chcę, to po prostu wartość 1391539861
lokalnej daty i godziny "04.02.2014 19:51:01"
. Moja strefa Europe/Oslo
czasowa to UTC + 1 z czasem letnim.
LocalDateTime
innej epoki niż ręczne jej obliczenie?Odpowiedzi:
Klasy
LocalDate
iLocalDateTime
nie zawierają informacji o strefie czasowej lub przesunięciu czasowym , a sekundy od epoki byłyby niejednoznaczne bez tej informacji. Jednak obiekty mają kilka metod przekształcania ich w obiekty daty / godziny ze strefami czasowymi przez przekazanieZoneId
instancji.LocalDate
LocalDateTime
źródło
ZoneId.ofOffset("UTC", ZoneOffset.ofHours(0))
long epoch = time.toEpochSecond(ZoneOffset.UTC)
dla przypadków UTC lub gdy znasz już strefę czasową, lublong epoch = time.toEpochSecond(ZoneId.systemDefault());
jeśli chcesz jechać tą trasą.Instant.ofEpochMilli(responseTime).atZone(ZoneId.systemDefault()).toLocalTime()
`` Milis od epoki unixowej '' reprezentuje chwilę, więc powinieneś użyć klasy Instant:
źródło
ZoneId.systemDefault()
ponieważ epoka unix odnosi się do UTCPotrzebna konwersja wymaga przesunięcia z UTC / Greewich lub strefy czasowej.
Jeśli masz przesunięcie, istnieje dedykowana metoda na
LocalDateTime
to zadanie:Jeśli masz tylko
ZoneId
, możesz uzyskaćZoneOffset
zZoneId
:Ale możesz znaleźć konwersję przez
ZonedDateTime
prostsze:źródło
long epochSec = localDateTime.toEpochSecond(ZoneOffset.UTC);
Spójrz na tę metodę, aby zobaczyć, które pola są obsługiwane. Znajdziesz dla
LocalDateTime
:Pole INSTANT_SECONDS - oczywiście - nie jest obsługiwane, ponieważ
LocalDateTime
nie może odwoływać się do żadnego absolutnego (globalnego) znacznika czasu. Ale pomocne jest pole EPOCH_DAY, które zlicza dni, które upłynęły od 01.01.1970. Podobne myśli dotyczą typuLocalDate
(z jeszcze mniej obsługiwanymi polami).Jeśli chcesz uzyskać nieistniejące pole milis-od-unix-epoch, potrzebujesz również strefy czasowej do konwersji z typu lokalnego na globalny. Ta konwersja może być znacznie prostsza, zobacz inne posty SO .
Wracając do pytania i liczb w kodzie:
16105L * 86400 + 71461 = 1391543461 sekund od 1970-01-01T00: 00: 00 (uwaga, brak strefy czasowej) Następnie możesz odjąć przesunięcie strefy czasowej (uważaj na możliwe pomnożenie przez 1000 w milisekundach).
UPDATE po podanej informacji o strefie czasowej:
Jak kod JSR-310 z dwoma równoważnymi podejściami:
źródło
LocalDateTime time = LocalDateTime.parse("04.02.2014 19:51:01", DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss"));
i wtedyLong epoch = time.atZone(ZoneId.of("Europe/Oslo")).toEpochSecond();
.Konwertuj z czytelnej dla człowieka daty na epokę :
Konwertuj z epoki na datę czytelną dla człowieka :
Dla innego konwertera języków: https://www.epochconverter.com
źródło
Jest to jeden sposób bez używania strefy czasowej:
źródło