Вы не можете сделать это правильно без учета часового пояса.
private void getpercentage(String dateTimeStart, String dateTimeExpiration) {
ZoneId zone = ZoneId.systemDefault();
ZonedDateTime start = LocalDateTime.parse(dateTimeStart.replace( " " , "T" ) )
.atZone(zone);
ZonedDateTime end = LocalDateTime.parse(dateTimeExpiration.replace( " " , "T" ) )
.atZone(zone);
long total = ChronoUnit.MICROS.between(start, end);
long passed = ChronoUnit.MICROS.between(start, ZonedDateTime.now(zone));
long percentage = passed * 100 / total;
System.out.println(String.valueOf(percentage) + " %");
}
Чтобы узнать, сколько дней прошло:
getpercentage("2020-05-30 00:00:00", "2020-05-31 00:00:00");
При запуске прямо сейчас в мой часовой пояс, Европа / Копенгаген:
91%
Чтобы проиллюстрировать мою точку зрения о часовом поясе: при запуске в часовом поясе Индии / Мальдив:
103%
Итак, в этом часовом поясе 30 мая уже закончилось, а 31 мая осталось 3%.
Использование типа long
и ChronoUnit.MICROS
(микросекунды) будут работать для промежутков времени до 290 000 лет. Для большего диапазона выберите более грубую единицу. Для большей точности и меньшего диапазона используйте более точные единицы измерения, то есть наносекунды.
Java 9 и более поздние версии
long percentage = Duration.between(start, ZonedDateTime.now(zone))
.multipliedBy(100)
.dividedBy(Duration.between(start, end));
Перегруженный метод Duration.dividedBy(Duration)
был введен в Java 9. Это позволяет нам использовать класс Duration
для вычислений, поэтому нам не нужно выбирать конкретную c единицу времени.