如何在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);
我省略了最终声明和金额逻辑,因为它们与所问的问题无关;您可以将它们放回您自己
ALocalDate
是一个没有时间的日期。我认为这是您需要的,请检查您自己
编辑:正如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));