【问题标题】:How to compare two dates in Java and then compare the result vs another date?如何比较 Java 中的两个日期,然后将结果与另一个日期进行比较?
【发布时间】:2020-06-17 23:44:25
【问题描述】:

这里是菜鸟!首先,我尝试比较dateOnedateTwo,然后将最近日期(> 0)cutOffDate 进行比较。

如果它在cutOffDate 之后,则将其设置为FinalDate,否则将cutOffDate 设置为FinalDate。我怎样才能做到这一点?

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

String类型中的compareTo(String)方法不适用于参数(Date)

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

【问题讨论】:

  • 不是答案,但是...您应该尽可能避免使用较旧的 DateSimpleDateFormat 类,而应使用较新的 java.time 类,例如 java.time.format.DateTimeFormatter。有关背景信息,请参阅 herehere
  • dateOne.compareTo(dateTwo) 似乎有问题...请澄清“似乎有问题”的确切含义。如果有错误,错误是什么。如果出现意外结果,实际结果和预期结果是什么?
  • 我建议你不要使用SimpleDateFormatDate。这些类设计不良且过时,尤其是前者,尤其是出了名的麻烦。而是使用来自java.time, the modern Java date and time APILocalDateDateTimeFormatter
  • 在 Stack Overflow 上发帖时,请从您的问题中删除所有无关代码。使用BigDecimal 的部分与本主题无关,应该删除。
  • java.util.Datejava.sql.Date?

标签: java


【解决方案1】:

你在正确的轨道上。你只需要另一个比较,你应该很好。

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 之后)。然后,对于每一项检查,您必须检查最近的日期是在截止日期之前还是之后。

【讨论】:

    【解决方案2】:

    来自 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() 也适用于 Date

    如果您现在无法将DateServiceImpl 升级到java.time,您可以以同样的方式在三个老式Date 对象上使用Collections.max()

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

    链接

    【讨论】:

    • 谢谢你教我Collections.max。对于使用 Java 9 及更高版本的用户,使用List.of 可能比Arrays.asList 更容易阅读:LocalDate finalDate = Collections.max( List.of( dateOne , dateTwo , cDate ) );。但无论哪种方式效果都一样。
    猜你喜欢
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多