Java.util.Calendar compareTo 未提供一致的结果

Java.util.Calendar compareTo not delivering consistent Results

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 returns 和 0 的所有时间都相同。

tl;博士

使用java.time.LocalDateclass.

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

小数秒变化

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

从大局来看,您使用的 糟糕 日期时间 classes 多年前被现代 java.time class在 JSR 310 中定义。切勿使用 DateCalendarSimpleDateFormat 等。

java.time

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

YYYY-MM-DD 的格式实际上是由 ISO 8601 定义的标准格式,用于日期时间值的文本数据交换。当 java.time classes 在 parsing/generating 这样的字符串时默认使用标准的 ISO 8601 格式。

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

LocalDate class implements Comparable, so they know how to sort themselves. And the class offers handy comparison methods: isBefore, isEqual, and isAfter.

boolean isXAfterY = x.isAfter( y ) ;

Android

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

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