Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中比较两个日期,然后将结果与另一个日期进行比较?_Java - Fatal编程技术网

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

如何在Java中比较两个日期,然后将结果与另一个日期进行比较?,java,Java,这里没有!首先,我尝试比较dateOne和dateTwo,然后比较哪一个具有最新日期(>0)将其与截止日期进行比较 如果其在截止日期之后,则将其设置为最终日期,否则将截止日期设置为最终日期。我怎样才能做到这一点 我不确定我是否在正确的轨道上,我在dateOne.compareTo(dateTwo)中遇到以下错误: 类型字符串中的方法compareTo(字符串)不适用于参数(日期) 公共DateServiceImpl进程(最终DateServiceImpl项)引发异常{ final Date da

这里没有!首先,我尝试比较
dateOne
dateTwo
,然后比较哪一个具有最新日期
(>0)
将其与
截止日期进行比较

如果其在
截止日期之后
,则将其设置为
最终日期
,否则将
截止日期
设置为
最终日期
。我怎样才能做到这一点

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

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

公共DateServiceImpl进程(最终DateServiceImpl项)引发异常{ final Date dateOne=item.getDateOne(); final Date dateTwo=item.getDateTwo(); final BigDecimal amountOne=item.getAmountOne(); final BigDecimal amountTwo=item.getAmountTwo(); SimpleDataFormat sdf=新的SimpleDataFormat(“MM/dd/yyyy”); 字符串截止日期=“01/01/2020”; 日期cDate=sdf.parse(截止日期); if((amountOne.compareTo(BigDecimal.ZERO)>0)和&(amountTwo.compareTo(BigDecimal.ZERO)>0)){
如果(dateOne.compareTo)到(dateTwo)你的思路是对的。你只需要再做一次比较,你就应该很好了

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

localdatefrom java.time and Collections.max() 务必使用java.time(现代java日期和时间API)进行日期工作。首先,java.time允许一次性声明格式化程序:

private static final DateTimeFormatter DATE_FORMATTER
        = DateTimeFormatter.ofPattern("MM/dd/yyyy");
我知道最终日期应该是
dateOne
dateTwo
和截止日期中的最晚日期。鉴于
dateserviceinpl
使用
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);
我省略了
最终声明和金额逻辑,因为它们与所问的问题无关;您可以将它们放回您自己

A
LocalDate
是一个没有时间的日期。我认为这是您需要的,请检查您自己

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

对于这还不够的情况,
LocalDate
还提供了用于比较的方法
isBefore
isAfter

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

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

链接
  • 解释如何使用java.time

这不是答案,但是……您应该尽可能避免使用较旧的
Date
SimpleDateFormat
类,而是使用较新的
java.time
类,例如
java.time.format.DateTimeFormatter
。有关一些背景信息,请参阅和。似乎
dateOne.compareTo(dateTwo)有问题
…请澄清什么“似乎有问题”确切的意思是。如果是错误,错误是什么。如果是意外的结果,实际结果和预期结果是什么?我建议您不要使用
SimpleDataFormat
Date
。这些类的设计很差,而且很早就过时了,前者尤其令人讨厌。相反,请使用
LocalDate
>DateTimeFormatter
,两者均来自。在堆栈溢出上发布时,请从问题中删除所有无关的代码。使用
BigDecimal
的部分与此主题无关,应该删除。
java.util.Date
java.sql.Date
?感谢您教我
Collections.max
。对于使用Ja的人va 9及更高版本,使用可能比数组更容易阅读。
asList
LocalDate finalDate=Collections.max(List.of(dateOne,dateTwo,cDate));
。但两种方法的效果都一样。
    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);
    LocalDate finalDate = Collections.max(List.of(dateOne, dateTwo, cDate));