【问题标题】:Comparing two dates using Joda time使用 Joda 时间比较两个日期
【发布时间】:2012-11-25 16:35:48
【问题描述】:

我想比较两个日期,但是遇到了麻烦。 1 个日期是从 java.util.date 对象创建的,另一个是手动制作的。以下代码为示例:

Date ds = new Date();
DateTime d = new DateTime(ds);

DateTime e = new DateTime(2012,12,07, 0, 0);
System.out.println(d.isEqual(e));

但是测试结果是false。我猜是因为时间的缘故。如何检查这两个日期是否相等(我的意思是年、月、日相同)?

【问题讨论】:

标签: java date time jodatime


【解决方案1】:

由于它们是 DateTime 对象,因此在比较它们时也会考虑它们的时间部分。尝试将第一个日期的时间部分设置为 0,例如:

d = d.withTime(0, 0, 0, 0);

【讨论】:

    【解决方案2】:
    System.out.println(d.toDateMidnight().isEqual(e.toDateMidnight()));
    

    System.out.println(d.withTimeAtStartOfDay().isEqual(e.withTimeAtStartOfDay()));
    

    【讨论】:

    • toDateMidnight() 已弃用,不应使用。相反,可以使用 withTimeAtStartOfDay() ,但它仍然不是最优的,因为它不会删除时区,因此如果两个日期具有不同的时区,它们将永远不会相等。
    • 我使用toLocalDate(),我认为它也有同样的问题。为了避免这种情况,我猜你可以链接withZone(),例如:d.toLocalDate().isEqual(e.withZone(d.zone).toLocalDate())。请注意,这是测试的。
    • 如果 d 和 e 是不同的时区,这将不起作用。上面查尔斯伍德的答案更可靠
    【解决方案3】:

    编写自己的方法

    public boolean checkEqual(DateTime first,DateTime second){
         if(first.<getterforyear> == second.<getterforyear> && first.<getterformonth> == second.<getterformonth> && first.<getterforday> == second.<getterforday>){
             return true;
      }
     return false;
    }
    

    【讨论】:

    • 类型相同,请仔细阅读问题。两者都是日期时间。
    • 这完全没有必要,因为 Joda Time 有许多实用方法可以做这种事情。
    【解决方案4】:

    如果您想忽略时间组件(即您只想比较日期),您可以使用 DateMidnight 类而不是 Date Time。所以你的例子看起来像这样:

    Date ds = new Date();
    DateMidnight d = new DateMidnight(ds);
    
    DateMidnight e = new DateMidnight(2012, 12, 7);
    System.out.println(d.isEqual(e));
    

    但请注意,它只会在今天打印“true” :)

    另请注意,默认情况下,JDK Date 和所有 Joda-Time 即时类(包括 DateTime 和 DateMidnight)都是使用默认时区构造的。因此,如果您创建一个日期以在代码中进行比较,但从可能以 UTC 存储日期的数据库中检索另一个日期,假设您不在 UTC 时区,您可能会遇到不一致。

    【讨论】:

    • DateMidnight in package time 已被弃用,建议使用 localDate
    • 所有与午夜相关的类和方法都已弃用,取而代之的是“一天中的第一刻”概念和方法。
    【解决方案5】:

    你应该使用 toLocalDate()

    date1.toLocalDate().isEqual(date2.toLocalDate())
    

    这将去掉 DateTime 的 Time 部分。

    还有另一种方法,但它没有考虑两个日期具有不同时区的情况,因此不太可靠:

    date1.withTimeAtStartOfDay().isEqual(date2.withTimeAtStartOfDay())
    

    【讨论】:

      【解决方案6】:
      return DateTimeComparator.getDateOnlyInstance().compare(first, second);
      

      通过How to compare two Dates without the time portion?

      【讨论】:

        【解决方案7】:

        这是一个适合我的静态方法。

        public static boolean isSameDay(DateTime date1, DateTime date2){
            return date1.withTimeAtStartOfDay().isEqual(date2.withTimeAtStartOfDay());
        }
        

        【讨论】:

        • 我没有看到使用toLocalDateexisting Answer 的优势。如果DateTime 对象具有不同的时区,则此方法会失败,而另一种答案的方法则不会。这是好是坏取决于业务问题。
        【解决方案8】:
        DateTimeComparator.getDateOnlyInstance().compare(obj1, obj2);
        

        obj1 和 obj2 可以是 String、Long、Date(java.util)... 详情见 http://www.joda.org/joda-time/apidocs/index.html?org/joda/time/DateTimeComparator.html

        【讨论】:

        • 欢迎来到 Stack Overflow!在回答问题之前,请务必阅读现有答案。这个答案已经提供了。不要重复答案,而是投票赞成现有的答案。可以在here 找到一些编写好答案的指南。
        【解决方案9】:

        我在寻找与今天的比较时偶然发现了这个问题。以下是您可以将日期与今天进行比较的方法:

        date1.toLocalDate().isBeforeNow() // works also with isAfterNow
        

        【讨论】:

        • 问题问的是平等,而不是之前或之后。 date1 是什么?不是取自问题。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-25
        • 2010-11-06
        相关资源
        最近更新 更多