Noob在这里!首先,我尝试将dateOne
和dateTwo
相互比较,然后将日期最近的(> 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;
}
}
答案 0 :(得分:5)
在日期工作中,请使用现代Java日期和时间API java.time。首先,java.time允许一劳永逸地声明格式化程序:
private static final DateTimeFormatter DATE_FORMATTER
= DateTimeFormatter.ofPattern("MM/dd/yyyy");
我知道最终日期应该是dateOne
,dateTwo
和截止日期中的最晚日期。假设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
还具有方法isBefore
和isAfter
用于比较。
如果您现在负担不起将DateServiceImpl
升级到java.time,则可以以相同的方式在三个老式Collections.max()
对象上使用Date
。
Collections.max()
也有一个重载版本,它以Comparator
作为第二个参数。由于LocalDate
和Date
都实现了Comparable
,因此我们在这里不需要。
Collections.max()
答案 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
之后)。然后,对于每个检查,您都必须检查最近的日期是在截止日期之前还是之后。