Java - как рассчитать лишние дни 2 даты - PullRequest
0 голосов
/ 13 января 2019

У меня есть скрипт, который показывает разные даты, но мне нужно получить 0 дней, если 'tglkembali' ниже, чем 'темп', но скрипт, который я набираю, рассчитывает оба способа

try{
    String tglsatu = tempo.getText();
    DateFormat date = new SimpleDateFormat("yyyy-MM-dd");
    Date tglAwal = (Date) date.parse(tglsatu);
    String tgldua = tglKembali.getText();
    Date tglAkhir = (Date) date.parse(tgldua);

    long bedaHari = tglAkhir.getTime() - tglAwal.getTime();
    terlambat.setText(TimeUnit.MILLISECONDS.toDays(bedaHari) + " hari");

    }catch(Exception e){
        JOptionPane.showMessageDialog(this, e.getMessage());
    }

}  

1 Ответ

0 голосов
/ 13 января 2019

java.time

    try {
        String tglSatu = "2019-01-07";
        LocalDate tglAwal = LocalDate.parse(tglSatu);
        String tglDua = "2019-01-18";
        LocalDate tglAkhir = LocalDate.parse(tglDua);

        long bedaHari = ChronoUnit.DAYS.between(tglAwal, tglAkhir);
        if (bedaHari < 0) {
            bedaHari = 0;
        }
        System.out.println("" + bedaHari + " hari");

    } catch (DateTimeParseException dtpe){
         System.out.println(dtpe.getMessage());
    }

Когда дни в ожидаемом порядке, как в приведенном выше фрагменте, выходные данные должны совпадать с вашими:

11 хари

Однако, если я изменю эту строку, чтобы поменять местами даты:

        String tglDua = "2018-12-29";

Теперь вывод из моего кода - это то, что вы просили:

0 хари

Угловой случай: когда я говорю, что выходной сигнал в первом случае одинаков, это только чаще всего верно. Вы использовали Date.getTime и TimeUnit.MILLISECONDS.toDays, поэтому вы выполнили преобразование из миллисекунд в дни, предполагая, что день всегда длится 24 часа. Это не всегда так. Например, весной, когда в некоторых странах начинается летнее время (DST), день обычно составляет всего 23 часа, что приводит к тому, что ваш код считает слишком мало. Класс LocalDate, который я использую, не имеет ни времени суток, ни часового пояса, поэтому уклоняется от этой проблемы.

Другая причина, по которой я использую java.time, современный Java-интерфейс даты и времени, заключается в том, что с ним гораздо удобнее работать, чем со старыми классами даты и времени, включая DateFormat, SimpleDateFormat и * 1026. *. У них были некоторые проблемы с дизайном, и нет никаких причин, по которым мы все еще должны бороться с ними.

Альтернативный вариант - сравнить даты с помощью isBefore или isAfter и показать сообщение, если они не в ожидаемом порядке. Например (с помощью Google Translate):

        if (tglAkhir.isBefore(tglAwal)) {
            System.out.println("Tanggal berada dalam urutan yang salah");
        } else {
            long bedaHari = ChronoUnit.DAYS.between(tglAwal, tglAkhir);
            System.out.println("" + bedaHari + " hari");
        }

Ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...