【问题标题】:Java.util.Calendar compareTo not delivering consistent ResultsJava.util.Calendar compareTo 未提供一致的结果
【发布时间】:2021-11-18 14:14:48
【问题描述】:
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 的所有时间都相同。

【问题讨论】:

  • 不要再使用过时的日历 API。换成新的 java.time api。
  • oldCal 和 newCal 的毫秒数可能不同
  • 您是否手动使用旧的日历 API 解析日期?现在是 2021 年,时间到 get with the program。哦等等,这是安卓。但它肯定不会卡在日历上(或笨拙的手动解析)。
  • 我认为你说得对 D Blacksmith with Calendar...以前没有使用过 LocalDate 但现在...生活很美好。

标签: java android calendar


【解决方案1】:

tl;博士

使用java.time.LocalDate 类。

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

小数秒变化

要直接回答您的问题,作为commented by D Blacksmith,您可能会看到小数秒的两个不同值,因为您调用了两次java.util.Calendar.getInstance(),这是两种不同的方法。

从大局来看,您正在使用 terrible 日期时间类,这些类在几年前被 JSR 310 中定义的现代 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 ) ;

安卓

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    相关资源
    最近更新 更多