【问题标题】:java - how to calculate the excess days of 2 datesjava - 如何计算2个日期的多余天数
【发布时间】:2019-01-13 06:43:30
【问题描述】:

我有一个显示不同日期的脚本,但我需要它是在“tglkembali”低于“tempo”时获得 0 天,但我键入的脚本是双向计算

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());
    }

}  

【问题讨论】:

  • 我建议你不要使用SimpleDateFormatDate。这些类设计不佳且早已过时,尤其是前者,尤其是出了名的麻烦。而是使用来自java.time, the modern Java date and time APILocalDateDateTimeFormatter。此外,ChronoUnit.DAYS.between() 对您的任务也很方便。
  • if-else 声明?如果差值为负,则打印 0。

标签: java database netbeans


【解决方案1】:

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());
    }

当日期按预期顺序时,如上面的 sn-p 中,输出应该与您的一致:

11 哈里

但是,如果我更改此行以便交换日期:

        String tglDua = "2018-12-29";

现在我的代码的输出是你所要求的:

0 哈里

极端情况:当我说前一种情况的输出相同时,这只是大多数情况下的正确性。您使用了Date.getTimeTimeUnit.MILLISECONDS.toDays,因此假设一天总是24 小时,您执行了从毫秒到天的转换。这并非总是如此。例如,在某些国家/地区开始夏令时 (DST) 的春季,一天通常只有 23 小时,这将导致您的代码计算一天太少。我使用的LocalDate 类既没有时间也没有时区,所以避开了这个问题。

我使用现代 Java 日期和时间 API java.time 的另一个原因是,它通常比旧的日期和时间类更好用,包括DateFormatSimpleDateFormat 和 @987654330 @。那些有一些设计问题,我们没有理由仍然要与它们作斗争。

另一种选择是使用isBeforeisAfter 比较日期,如果它们不符合预期的顺序,则显示一条消息。例如(在 Google 翻译的帮助下):

        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");
        }

链接:

【讨论】:

  • 啊,谢谢先生。它对像我这样的初学者有很大帮助。再次感谢
猜你喜欢
  • 1970-01-01
  • 2014-11-26
  • 2014-08-07
  • 2020-10-16
  • 1970-01-01
  • 2014-09-19
  • 2010-11-13
  • 1970-01-01
  • 2021-03-11
相关资源
最近更新 更多