【问题标题】:Java: Compare Date.getTime with a different date [duplicate]Java:将 Date.getTime 与不同的日期进行比较 [重复]
【发布时间】:2014-12-16 16:54:33
【问题描述】:

有日期date1,格式为YY-MM-dd hh:mm:ss.SSS 我要比较

date1.getTime()

通过执行检索到一个

new Date().getTime()

SimpleDateFormat sf = new SimpleDateFormat("YY-MM-dd hh:mm:ss.SSS");
Date date1 = sf.parse(date1AsString);
...
compare date1.getTime() with new Date().getTime();

如何将这两个日期带到一个共同的“时区”来比较它们? 如何使 date1 与 new Date() 具有相同的“时间长度”?我想有相同的时区... 谢谢

【问题讨论】:

  • A Date 没有时区。
  • 好的,但是如何比较这些值?
  • new Date().compareTo(date1) 也许?目前尚不清楚您要实现的目标...
  • 它们是两个long 值。你知道如何比较数值吗?
  • Date 没有时区。

标签: java date unix-timestamp


【解决方案1】:

来自Datejavadoc

Date 类表示特定的时间瞬间,精度为毫秒。

时间实例与我们对时区增强的时间定义无关。 现在对你和我来说都是一样的,不管我们(可能)在不同的时区。

添加时区概念的是DateFormat

日期表示为 Date 对象或自 1970 年 1 月 1 日 00:00:00 GMT 以来的毫秒数。

当您调用Date#getTime() 时,您会返回

自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象所表示的毫秒数。

这是您可以用来比较 Date 对象的东西,因为它们具有相同的根。同样,compareTo 将返回

如果参数Date等于这个Date,则值为0;一个值 如果此 DateDate 参数之前,则小于 0;和一个值 如果此 Date 在 Date 参数之后,则大于 0。

【讨论】:

    【解决方案2】:

    如果时区信息未知,则无法比较两个日期。

    例如,如果您的date1AsString 变量只是2014-12-16 16:00:00,那么您无法判断它是大于还是小于2014-12-16 20:00:00+0000

    第一次约会比第二次约会少 4 小时;但如果有人补充说第一个日期是太平洋时间 (UTC-0800),那么它实际上会比第二个日期多 4 小时 (2014-12-16 16:00:00-0800 = 2014-12-17 00:00:00+0000)。

    因此,如果date1AsString 的时区未知,则您无法将其转换为 UTC 或其他任何时间进行比较。

    【讨论】:

      【解决方案3】:

      getTime() 返回自 1970 年 1 月 1 日 00:00:00 以来的毫秒数。你会想要比较两个longs,大致如下:

      long time = new Date().getTime();
      long time2 = date1.getTime();
      if(time>time2)
          System.out.println(String.format("time is greater than time2 by %d", time-time2)
      else
          System.out.println(String.format("time2 is greater than time by %d", time2-time)
      

      【讨论】:

      • 时区明智,你怎么知道使用哪个时区?例如 Date1 可能已经是 EST,您可以尝试再次将其转换为 EST,从而扭曲您的结果。如果您将两个时区都与日期一起存储,只需进行一些算术运算即可确定时区之间的时间差。
      【解决方案4】:

      如果你知道时区 date1.setTime(date1.getTime()+/-(3600000*hours)) 进行转换,如果 date1 时间是 GMT 去 GMT+2 小时必须是 2 并且 sing 必须是 +

      【讨论】:

      • 仅当他不需要第二个分辨率时。
      【解决方案5】:

      通常,任何服务器环境都将使用 GMT,因此在比较日期时您不必担心时区,只需在格式化要显示给用户的值时。

      您可以像这样比较两个日期:

      SimpleDateFormat sf = new SimpleDateFormat("YY-MM-dd hh:mm:ss.SSS");
      Date date1 = sf.parse(date1AsString);
      
      boolean isBefore = date1.before(new Date());
      boolean isAfter = date1.after(new Date());
      

      或者,您可以比较 unix 时间的数值以获得相同的结果:

      ...
      
      boolean isBefore = date1.getTime() < new Date().getTime();
      boolean isAfter = date1.getTime() > new Date().getTime();
      

      【讨论】:

        【解决方案6】:

        Date 类具有 before(date)after(date) 等方法。你应该看看Date Class。

        【讨论】:

        • 好的,但是 simpledateformat 是如何转换成日期的呢?如何确定是同一时间?
        【解决方案7】:

        所以我认为您正在寻找的是设置 SimpleDateFormat 的时区:

        sf.setTimeZone(TimeZone.getTimeZone("EST"));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-14
          • 1970-01-01
          • 1970-01-01
          • 2017-10-01
          • 1970-01-01
          相关资源
          最近更新 更多