Mam zewnętrzny interfejs API, który zwraca mi daty jako long
s, reprezentowane jako milisekundy od początku Epoki.
W starym stylu Java API, po prostu konstruowałbym Date
z niego
Date myDate = new Date(startDateLong)
Jaki jest odpowiednik w Javie 8 LocalDate
/ LocalDateTime
klasach?
Jestem zainteresowany przekształcając punkt w czasie, reprezentowana przez long
Do LocalDate
w moim obecnym lokalnej strefy czasowej.
java.util.Date
tak naprawdę nigdy nie była to randkaLocalDate
- to była chwila.java.util.Date
doLocalDate
File.lastModified()
(epoka millis) naLocalDate(Time)
.Odpowiedzi:
Jeśli masz milisekundy od Epoki i chcesz przekonwertować je na lokalną datę przy użyciu bieżącej lokalnej strefy czasowej, możesz użyć
ale należy pamiętać, że nawet domyślna strefa czasowa systemu może ulec zmianie, dlatego ta sama
long
wartość może powodować różne wyniki w kolejnych uruchomieniach, nawet na tym samym komputerze.Ponadto należy pamiętać, że
LocalDate
w przeciwieństwie do tegojava.util.Date
, naprawdę reprezentuje datę, a nie datę i godzinę.W przeciwnym razie możesz użyć
LocalDateTime
:źródło
LocalDateTime.ofEpochSecond(…)
wymaga faktycznegoZoneOffset
, aleZoneId.systemDefault()
zwraca aZoneId
.ZoneId
Można mapować do różnych przesunięć, w zależności od punktu czasu masz na myśli. ToLocalDateTime.ofInstant
robi dla ciebie, konwertując określoneZoneId
zgodnie z podanymiInstant
.LocalDate
lubLocalDateTime
. Możesz określić dowolną strefę czasową, o ile jest to zgodne z późniejszym użyciem tych obiektów wynikowych. Pomyśl o tym, co dzieje się, gdy masz do czynienia z wieloma obiektami utworzonymi różnymi metodami. Typowe przypadki użycia dla lokalnej daty lub czasu danych obejmują domyślną strefę czasową systemu, np.LocalDateTime.now()
≈LocalDateTime.ofInstant(Instant.ofEpochMilli(System.currentTimeMillis()), ZoneId.systemDefault())
…Możesz zacząć od Instant.ofEpochMilli (długi) :
źródło
Myślę, że mam lepszą odpowiedź.
źródło
Timestamp
Klasa jest źle zaprojektowana i długo nieaktualne. Twój kod będzie używał ustawienia strefy czasowej JVM, ale ponieważ to ustawienie może zostać zmienione przez inną część Twojego programu lub inny program działający w tej samej JVM, nie możemy być całkiem pewni, co to jest.Poza strefami czasowymi i innymi rzeczami,
new Date(startDateLong)
może to być bardzo prosta alternatywaLocalDate.ofEpochDay(startDateLong / 86400000L)
źródło
java.time
nie obejmuje toDateTimeConstants
tak jak Joda.java.util.concurrent.TimeUnit.MILLISECONDS.toDays(startDateLong)
zamień now.getTime () na swoją długą wartość.
źródło
W konkretnym przypadku, gdy znacznik czasu twojej epoki pochodzi z SQL lub jest w jakiś sposób związany z SQL, możesz go uzyskać w następujący sposób:
źródło
LocalDate
odepoch-millis
”, a ja pokazuję, jak to zrobić za pomocąjava.sql.Date
skrótu. To podejście ma sens w kodzie, który już w pewnym stopniu zajmuje się JDBC, i działa dobrze. Jeśli nadal nie jesteś przekonany, wyjaśnij, w jaki sposób nie ma to związku z początkowym pytaniem.java.sql.Date
podejście należy do najkrótszych dostępnych, pod względem kodu, i powiedziałbym, że nie jest to aż tak przydatne iśćInstant
ze wszystkimi pośrednimi obiektami czasowymi, gdy wynik końcowy jest taki sam.