Java.util.Calendar compare无法提供一致的结果


public boolean checkDates(String oldDate, String newDate){
java.util.Calendar oldCal = java.util.Calendar.getInstance();
java.util.Calendar newCal = java.util.Calendar.getInstance();
String[] oD = oldDate.split("-");
String[] nD = newDate.split("-");
oldCal.set(Integer.parseInt(oD[0]), Integer.parseInt(oD[1])-1, Integer.parseInt(oD[2]));
newCal.set(Integer.parseInt(nD[0]), Integer.parseInt(nD[1])-1, Integer.parseInt(nD[2]));
if(newCal.compareTo(oldCal) > 0){
return true;
}else {
return false;
}

这就是我正在实现的代码,在同一天的不同日期都有不同的结果。有时compareTo传递1,有时传递0。正在比较的日期打印示例:

oldCal Fri Nov 17 23:30:48 CST 2021
newCal Fri Nov 17 23:30:48 CST 2021

1和0的所有时间都是相同的。

tl;dr

使用java.time.LocalDate类。

LocalDate
.parse( "2022-01-23" )
.isAfter(
LocalDate.of( 2030 , Month.DECEMBER , 31 )
)

分数秒变化

正如D Blacksmith所评论的,为了直接回答您的问题,您可能会看到小数秒的两个不同值,因为您调用了两次java.util.Calendar.getInstance(),两种不同的方法。

从更大的角度来看,您使用的是几年前被JSR310中定义的现代java.time类取代的糟糕的日期-时间类。切勿使用DateCalendarSimpleDateFormat等。

java.time

我想您正在尝试比较YYYY-MM-DD格式的仅限日期的字符串值。如果是这样的话,那么编写checkDates方法的整个需求就没有意义了。

YYYY-MM-DD的格式实际上是ISO 8601定义的用于日期-时间值的文本数据交换的标准格式。在解析/生成此类字符串时,java.time类默认使用标准ISO 8601格式。

LocalDate x = LocalDate.parse( "2022-01-23" ) ;
LocalDate y = LocalDate.of( 2030 , Month.DECEMBER , 31 ) ;

LocalDate类实现了Comparable,因此它们知道如何对自己进行排序。该类提供了方便的比较方法:isBeforeisEqualisAfter

boolean isXAfterY = x.isAfter( y ) ;

Android

java.time功能内置于Android 26及更高版本中。

对于早期的Android,现代工具通过"API desugaring"提供了java.time的大部分功能。如果这不起作用,请将ThreeTenABP库添加到您的项目中。

最新更新