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.LocalDate
class.
LocalDate
.parse( "2022-01-23" )
.isAfter(
LocalDate.of( 2030 , Month.DECEMBER , 31 )
)
小数秒变化
直接回答您的问题,如 ,您可能会看到小数秒有两个不同的值,因为您调用了 java.util.Calendar.getInstance()
两次,两种不同的方法。
从大局来看,您使用的 糟糕 日期时间 classes 多年前被现代 java.time class在 JSR 310 中定义。切勿使用 Date
、Calendar
、SimpleDateFormat
等。
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 库添加到您的项目中。
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.LocalDate
class.
LocalDate
.parse( "2022-01-23" )
.isAfter(
LocalDate.of( 2030 , Month.DECEMBER , 31 )
)
小数秒变化
直接回答您的问题,如 java.util.Calendar.getInstance()
两次,两种不同的方法。
从大局来看,您使用的 糟糕 日期时间 classes 多年前被现代 java.time class在 JSR 310 中定义。切勿使用 Date
、Calendar
、SimpleDateFormat
等。
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 库添加到您的项目中。