Java Как получить процент между двумя датами - PullRequest
0 голосов
/ 30 мая 2020

Я хочу получить процентное соотношение между двумя DateTimes, чтобы я мог использовать индикатор выполнения.

У меня есть следующий код, который я передаю в двух датах и ​​делаю сумму, но получаю сообщение об ошибке.

private void getpercentage(String dateTimeStart, String dateTimeExpiration) {

    LocalDateTime start = LocalDateTime.parse(dateTimeStart.replace( " " , "T" ) );
    LocalDateTime end = LocalDateTime.parse(dateTimeExpiration.replace( " " , "T" ) );
    String start_date = start.toString().replace( "T", " " );
    String end_date = end.toString().replace( "T", " " );
    String p = Math.round( (end_date - start_date) * 100) + '%';
    Log.d("type", "Date parsed : " + p);

}

1 Ответ

2 голосов
/ 30 мая 2020

Вы не можете сделать это правильно без учета часового пояса.

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 единицу времени.

...