【问题标题】:How to check if 2 dates are on the same day in Java如何在Java中检查2个日期是否在同一天
【发布时间】:2014-04-21 18:28:29
【问题描述】:

我有 2 个日期变量,Date1 和 Date2。 我想检查日期 1 是否与日期 2 位于同一日期(但它们可以有不同的时间)。

我该怎么做?

这看起来很容易做,但我很挣扎。

编辑:我想避免使用外部库和东西

编辑: 我最初的想法是删除小时、分钟、秒,但这些功能在 Java 中被标记为已弃用。那我应该用什么????

【问题讨论】:

标签: java date


【解决方案1】:

虽然基于 java.util.Date 的日期组成部分给出的答案在许多部分都足够了,但我要强调一点,java.util.Date 不是日期而是一种 UNIX 时间戳以毫秒为单位。这样做的后果是什么?

Date-timestamps 的仅日期比较取决于上下文的时区。例如在 UTC 时区,仅日期比较是直截了当的,最终只会比较年、月和日部分,请参阅其他答案(我不需要重复)。

但以 2011 年西萨摩亚跨越国际日期变更线的情况为例。您可以使用 java.util.Date 类型的有效时间戳,但如果您考虑其在萨摩亚的日期部分,您甚至可以获得无效日期 (2011-12 -30 在萨摩亚本地从未存在过),因此仅比较日期部分可能会失败。此外,根据时区的不同,日期部分通常与 UTC 区域中的本地日期相差一天,在最坏的情况下甚至相差两天。

所以以下解决方案的扩展稍微更精确:

SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd");
fmt.setTimeZone(...); // your time zone
return fmt.format(date1).equals(fmt.format(date2));

对于更程序化的方法也存在类似的扩展,首先将 j.u.Date-timestamp 转换为 java.util.GregorianCalendar,然后设置时区,然后比较日期组件。

【讨论】:

    【解决方案2】:

    您为什么不简单地比较年、月和日?您可以编写您的方法来执行此操作,例如:

    private boolean isDateSame(Calendar c1, Calendar c2) {
        return (c1.get(Calendar.YEAR) == c2.get(Calendar.YEAR) && 
                c1.get(Calendar.MONTH) == c2.get(Calendar.MONTH) &&
                c1.get(Calendar.DAY_OF_MONTH) == c2.get(Calendar.DAY_OF_MONTH));
    }
    

    【讨论】:

      【解决方案3】:

      今天 = 时间跨度

      虽然其他答案可能是正确的,但我更喜欢我们认识到“今天”实际上是一个时间跨度的方法。

      由于夏令时 (DST) 等异常情况,日子的长度会有所不同,并非总是 24 小时。在美国,有些日子是 23 小时,有些是 25 小时。

      半开

      通常在数据时间工作中,我们使用“半开放”策略,其中跨度的开头是包含的,结尾是独占的。所以这意味着“今天”从今天的第一刻到明天的第一刻,但不包括。

      时区

      时区很关键,如correct answer by Meno Hochschild 中所述。一天的第一刻取决于其时区规则。

      乔达时间

      Joda-Time 库有很好的类来处理时间跨度:Period、Duration 和 Interval

      DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
      DateTime now = new DateTime( timeZone );
      Interval today = new Interval( now.withTimeAtStartOfDay(), now.plusDays(1).withTimeAtStartOfDay() );
      
      DateTime dateTimeInQuestion = new DateTime( date ); // Convert java.util.Date.
      boolean happensToday = today.contains( dateTimeInQuestion );
      

      好处

      这种使用时间跨度的方法有很多好处:

      • 避免夏令时 (DST) 问题
      • 让您可以比较其他时区的日期时间值
      • 灵活,因此您可以将相同类型的代码用于其他跨度(多天、多月等)
      • 让您的注意力从日历日期(分层抽象)转移到作为流动时间轴上的点的日期时间(基本事实)。

      Java 8 有一个新的 java.time package 内置。这些新类以 Joda-Time 为模型,但完全重新构建。可以使用 java.time 编写相同类型的代码。

      【讨论】:

        【解决方案4】:

        当您使用 toString() 方法时,您会得到什么?也只是年/月/日还是时间?如果是,那么您可以简单地比较两个对象的字符串。 (date1.toString().equals(date2.toString()));

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-04-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-01
          • 1970-01-01
          相关资源
          最近更新 更多