Como extraio o valor de época Long
de instâncias de LocalDateTime
ou LocalDate
? Tentei o seguinte, mas obtive outros resultados:
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
O que eu quero é simplesmente o valor 1391539861
da data e hora local "04.02.2014 19:51:01"
. Meu fuso horário é Europe/Oslo
UTC + 1 com horário de verão.
LocalDateTime
outra coisa do que calculá-la manualmente?Respostas:
As classes
LocalDate
eLocalDateTime
não contêm informações sobre o fuso horário ou deslocamento de tempo , e os segundos desde a época seriam ambíguos sem essas informações. No entanto, os objetos têm vários métodos para convertê-los em objetos de data / hora com fusos horários, passando umaZoneId
instância.LocalDate
LocalDateTime
fonte
ZoneId.ofOffset("UTC", ZoneOffset.ofHours(0))
long epoch = time.toEpochSecond(ZoneOffset.UTC)
para casos UTC, ou onde você já sabe o fuso horário, oulong epoch = time.toEpochSecond(ZoneId.systemDefault());
se deseja seguir esse caminho.Instant.ofEpochMilli(responseTime).atZone(ZoneId.systemDefault()).toLocalTime()
'Millis since unix epoch' representa um instante, então você deve usar a classe Instant:
fonte
ZoneId.systemDefault()
porque unix epoch refere-se a UTCA conversão de que você precisa requer o deslocamento de UTC / Greewich ou um fuso horário.
Se você tiver um deslocamento, existe um método dedicado on
LocalDateTime
para esta tarefa:Se você tiver apenas um
ZoneId
, poderá obter oZoneOffset
deZoneId
:Mas você pode encontrar conversão por meio de uma forma
ZonedDateTime
mais simples:fonte
long epochSec = localDateTime.toEpochSecond(ZoneOffset.UTC);
Observe este método para ver quais campos são suportados. Você encontrará por
LocalDateTime
:O campo INSTANT_SECONDS - é claro - não é suportado porque um
LocalDateTime
não pode se referir a nenhum carimbo de data / hora absoluto (global). Mas o que é útil é o campo EPOCH_DAY que conta os dias decorridos desde 01-01-1970. Pensamentos semelhantes são válidos para o tipoLocalDate
(com campos ainda menos suportados).Se você pretende obter o campo millis-since-unix-epoch não existente, você também precisa do fuso horário para converter de um tipo local em global. Essa conversão pode ser feita de maneira muito mais simples, consulte outros posts do SO .
Voltando à sua pergunta e aos números em seu código:
16105L * 86400 + 71461 = 1391543461 segundos desde 1970-01-01T00: 00: 00 (atenção, sem fuso horário) Então, você pode subtrair o deslocamento do fuso horário (cuidado com a possível multiplicação por 1000 se em milissegundos).
ATUALIZAR após determinadas informações de fuso horário:
Como código JSR-310 com duas abordagens equivalentes:
fonte
LocalDateTime time = LocalDateTime.parse("04.02.2014 19:51:01", DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss"));
e entãoLong epoch = time.atZone(ZoneId.of("Europe/Oslo")).toEpochSecond();
.Converter de data legível por humanos em época :
Converter de época em data legível por humanos :
Para outro conversor de idioma: https://www.epochconverter.com
fonte
Esta é uma maneira sem usar fuso horário:
fonte