如何在Java中比较两个日期,然后将结果与另一个日期进行比较?

时间:2020-06-17 23:44:25

标签: java

Noob在这里!首先,我尝试将dateOnedateTwo相互比较,然后将日期最近的(> 0)中的哪一个与cutOffDate进行比较。

如果它在cutOffDate之后,请将其设置为FinalDate,否则将cutOffDate设置为FinalDate。我该如何实现?

我不确定我是否在正确的轨道上,我遇到dateOne.compareTo(dateTwo)的以下错误:

字符串类型中的compareTo(String)方法不适用于参数(日期)

public DateServiceImpl process(final DateServiceImpl item) throws Exception {

    final Date dateOne = item.getDateOne();
    final Date dateTwo = item.getDateTwo();

    final BigDecimal amountOne= item.getAmountOne();
    final BigDecimal amountTwo= item.getAmountTwo();

    SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
    String cutOffDate = "01/01/2020";

    Date cDate = sdf.parse(cutOffDate);
    if ((amountOne.compareTo(BigDecimal.ZERO) > 0) && (amountTwo.compareTo(BigDecimal.ZERO) > 0)){
        if (dateOne.compareTo(dateTwo) <= 0) {
             item.setFinalDate(cDate);
        }
        return null;
    }
}

2 个答案:

答案 0 :(得分:5)

java.time和Collections.max()中的LocalDate

在日期工作中,请使用现代Java日期和时间API java.time。首先,java.time允许一劳永逸地声明格式化程序:

private static final DateTimeFormatter DATE_FORMATTER
        = DateTimeFormatter.ofPattern("MM/dd/yyyy");

我知道最终日期应该是dateOnedateTwo和截止日期中的最晚日期。假设DateServiceImpl使用LocalDate而不是Date,则可以简化逻辑:

    LocalDate dateOne = item.getDateOne();
    LocalDate dateTwo = item.getDateTwo();

    String cutOffDate = "01/01/2020";

    LocalDate cDate = LocalDate.parse(cutOffDate, DATE_FORMATTER);

    LocalDate finalDate = Collections.max(Arrays.asList(dateOne, dateTwo, cDate));

    item.setFinalDate(finalDate);

我已经省略了final声明和金额逻辑,因为它们与所问的问题无关;您可以将它们放回自己。

LocalDate是没有时间的日期。我以为这就是您所需要的,请检查一下自己。

编辑:正如Basil Bourque在评论中建议的那样,如果使用Java 9或更高版本,您可能更喜欢List.of()胜过Arrays.asList()

    LocalDate finalDate = Collections.max(List.of(dateOne, dateTwo, cDate));

对于不够的情况,LocalDate还具有方法isBeforeisAfter用于比较。

Collections.max()也可以与日期一起使用

如果您现在负担不起将DateServiceImpl升级到java.time,则可以以相同的方式在三个老式Collections.max()对象上使用Date

Collections.max()也有一个重载版本,它以Comparator作为第二个参数。由于LocalDateDate都实现了Comparable,因此我们在这里不需要。

链接

答案 1 :(得分:3)

您在正确的轨道上。您只需要再进行一次比较就可以了。

if (dateOne.compareTo(dateTwo) > 0) {
    if (dateOne.compareTo(cDate) > 0) {
        item.setFinalDate(dateOne);
    } else {
        item.setFinalDate(cDate);
    }
} else {
    if (dateTwo.compareTo(cDate) > 0) {
        item.setFinalDate(dateTwo);
    } else {
        item.setFinalDate(cDate);
    }
}

您需要检查日期顺序的每种情况(检查dateOne是否在dateTwo之前,并检查dateOne是否在dateTwo之后)。然后,对于每个检查,您都必须检查最近的日期是在截止日期之前还是之后。