【问题标题】:How can I tell if a Java Date and time zone is before the current time?如何判断 Java 日期和时区是否早于当前时间?
【发布时间】:2013-02-06 01:18:57
【问题描述】:

我的班级有 2 个属性构成其日期:

java.util.Date date;
String timeZone;

如何查看此日期是否早于服务器上的当前时间?

基本上我想写这样的东西,但要考虑时区:

return date.before(new Date());

【问题讨论】:

  • Date 在内部存储为 UTC,因此您的 timeZone 变量不是必需的且令人困惑。
  • timeZone 是创建日期的用户所在的时区。
  • 你是如何构建你的Date的?
  • 它从html表单发送,然后保存在数据库中。
  • 这个问题之前回答过:stackoverflow.com/questions/2911924/…

标签: java date jodatime


【解决方案1】:

Date 在内部存储为 UTC,因此您的 timeZone 变量不是必需的。你可以简单地使用Date.before(Date)

【讨论】:

    【解决方案2】:
        Calendar startCalendar = Calendar.getInstance();
        int startTimeZoneOffset = TimeZone.getTimeZone(timeZone).getOffset(startDate.getTime()) / 1000 / 60;
        startCalendar.setTime(startDate);
        startCalendar.add(Calendar.MINUTE, startTimeZoneOffset);
    
        Calendar nowCalendar = Calendar.getInstance();
        int nowTimeZoneOffset = nowCalendar.getTimeZone().getOffset(new Date().getTime()) / 1000 / 60;
        nowCalendar.setTime(new Date());
        nowCalendar.add(Calendar.MINUTE, nowTimeZoneOffset);
    
        return startCalendar.before(nowCalendar);
    

    【讨论】:

      【解决方案3】:

      tl;博士

      使用Instant 类,它总是在UTC 中。所以time zone 不再是问题。

      someInstant.isBefore( Instant.now() )
      

      java.time

      现代方法使用 java.time 类取代了可怕的 DateCalendar 类。

      正如correct Answer by Kuo 所说,您的java.util.Date 正在记录UTC 时刻。所以不需要时区。

      同样,它的替代品 java.time.Instant 类也记录了 UTC 时刻。所以不需要时区。

      Instant instant = Instant.now() ;  // Capture current in UTC. 
      

      因此,作为类的成员变量,您只需要Instant

      public class Event {
          Instant when ;
          …
      }
      

      要比较Instant 对象,请使用isAfterisBeforeequals 方法。

      someInstant.isBefore( Instant.now() ) 
      

      对于在用户期望的时区进行演示,分配一个ZoneId 以获取一个ZonedDateTime 对象。 InstantZonedDateTime 都代表同一时刻,时间轴上的同一点,但通过不同的挂钟时间查看。

      ZoneId z = ZoneId.of( "America/Montreal" ) ;
      ZonedDateTime zdt = instant.atZone( z ) ;     // Same moment, different wall-clock time.
      String output = zdt.toString() ;              // Generate text in standard ISO 8601 format, wisely extended to append the name of the zone in square brackets.
      

      或者让java.time自动本地化输出。要进行本地化,请指定:

      • FormatStyle 确定字符串的长度或缩写。
      • Locale 确定:
        • 人类语言用于翻译日名、月名等。
        • 文化规范决定缩写、大写、标点、分隔符等问题。

      例子:

      Locale l = Locale.CANADA_FRENCH ;   // Or Locale.US, Locale.JAPAN, etc.
      DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL )
                                             .withLocale( l );
      String output = zdt.format( f );
      

      关于java.time

      java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

      Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

      要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

      您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。

      从哪里获得 java.time 类?

      ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-05
        • 2015-07-29
        • 2015-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-21
        • 2017-03-13
        相关资源
        最近更新 更多