Узнайте разницу между двумя датами, представленными двумя значениями Long epoch

Мне нужно, чтобы у меня было значение в Long, которое представляет значение миллисекунд с эпохи. Я хочу узнать разницу в количестве дней между тем днем ​​и текущим днем. Я использую Java8 DAYS.between(inputDate, currentDate)

Для currentDate я использовал LocalDateTime currentDate = LocalDateTime.now(); Но проблема, с которой я сталкиваюсь, заключается в том, что я конвертирую длинное значение в java8 LocalDateTime. Когда я использую

LocalDate date = Instant.ofEpochMilli(1490372528)
  .atZone(ZoneId.systemDefault())
  .toLocalDate();

В результате получается 1970-01-18, а когда я ввожу то же значение в https://www.epochconverter.com/, оно дает Fri, 24 Mar 2017 16:22:08 GMT

Почему существует это несоответствие? Как эффективно получить дату java8 из длинного значения для использования в DAYS.between()?


person aayush_v20    schedule 04.05.2017    source источник
comment
Со страницы, на которую вы ссылаетесь: Эпоха Unix (или время Unix, или время POSIX, или отметка времени Unix) — это количество секунд, прошедших с 1 января 1970 года). ofEpochMilli, как следует из названия, ожидает миллисекунд. Используйте docs.oracle.com/ javase/8/docs/api/java/время/   -  person JB Nizet    schedule 04.05.2017


Ответы (1)


Вы должны решить. Либо ваше число — это «значение миллисекунд с эпохи», как вы указали в своем вопросе, либо это «количество секунд, прошедших с 1 января 1970 года», как указано (и используется) на связанном веб-сайте.

Если это действительно «миллисекунды с эпохи», вы можете использовать

System.out.println(Instant.ofEpochMilli(1490372528).until(Instant.now(), ChronoUnit.DAYS));

вывести количество дней, что, кстати, не проще кода до Java 8

System.out.println(TimeUnit.MILLISECONDS.toDays(System.currentTimeMillis()-1490372528));

Если ваше число на самом деле «секунды с эпохи», вам мало что нужно изменить в вашем коде.

System.out.println(Instant.ofEpochSecond(1490372528).until(Instant.now(),ChronoUnit.DAYS));

что эквивалентно

System.out.println(ChronoUnit.DAYS.between(Instant.ofEpochSecond(1490372528),Instant.now()));

как вы упомянули DAYS.between явно. Он просто делегирует метод until, использованный выше. Эквивалентный код до Java 8 будет немного сложнее.

System.out.println(TimeUnit.MILLISECONDS.toDays(
                       System.currentTimeMillis()-TimeUnit.SECONDS.toMillis(1490372528)));
person Holger    schedule 05.05.2017
comment
Отличный ответ. Кроме того, что вы думаете об этом ответе? stackoverflow.com/a/20811441/4358787 - person Gaurav; 02.07.2018
comment
@gaurav хорошо, он выполняет свою работу, но я бы постарался избежать таких ручных вычислений, поскольку есть классы, такие как TimeUnit или Duration, которые уже выполняют эту работу, то есть для двух экземпляров Date вы можете просто использовать System.out.println(Duration.between(d2.toInstant(), d1.toInstant()));. - person Holger; 02.07.2018
comment
Имеет смысл избегать таких расчетов. Поскольку я использую Java 1.7, я буду использовать методы класса TimeUnit. - person Gaurav; 02.07.2018