Java:GregorianCalendar的最大值和最小值是什么/在哪里?

GregorianCalendar的最大值和最小值是多少?

它们是一个常数,如Integer.MAX_VALUE,还是GregorianCalendar.get(BLAH)?

简而言之,如何创建具有最小/最大值的GregorianCalendar实例?

这应该工作:

GregorianCalendar maxgc = new GregorianCalendar(); maxgc.setTime(new Date(Long.MAX_VALUE)); GregorianCalendar mingc = new GregorianCalendar(); mingc.setTime(new Date(Long.MIN_VALUE)); 

我采取了joekutner的建议并运行它:

 GregorianCalendar gCal = new GregorianCalendar( ); gCal.setTime(new Date(Long.MIN_VALUE)); System.out.println( "Min Date is " + gCal.getTime() + " " + gCal.get(Calendar.ERA)); gCal.set( Calendar.SECOND, 3 ); System.out.println( "Min Date less 1 second is " + gCal.getTime() + " " + gCal.get(Calendar.ERA)); gCal.setTime(new Date(Long.MAX_VALUE)); System.out.println( "Max Date is " + gCal.getTime() + " " + gCal.get(Calendar.ERA)); Min Date is Sun Dec 02 16:47:04 GMT 292269055 0 Min Date less 1 second is Sun Aug 17 07:12:54 GMT 292278994 1 Max Date is Sun Aug 17 07:12:55 GMT 292278994 1 

其中显示了最小值和最大值,并且它们之间是一个指示,如果您尝试在最小值之前移动到第二个,那么会发生什么 – 您可以回绕一下。

这是版本1.6.0_17。


您可以尝试为每种类型的字段(即年,月等)调用Calendar.getMinimum() ,然后在相应的字段类型上设置这些最小值。 这将为您提供最低日历。 我不知道是否有更快的方法可以做到这一点。

其他答案可能是正确的,但使用过时的类。

java.time

旧的日期时间类(java.util.Date/.Calendar等)已被Java 8及更高版本中内置的java.time框架取代。

java.time类的灵感来自Joda-Time ,由JSR 310定义,由ThreeTen-Extra项目扩展,由ThreeTen-Backport项目后端移植到Java 6和7,并在ThreeTenABP项目中适应Android。 请参阅教程 。

在UTC的时间轴上片刻,分辨率为纳秒 ,使用Instant 。 给定与UTC的偏移量 ,使用OffsetDateTime 。 对于时区 (偏移量+exception规则),使用ZonedDateTime ,但其性质没有定义的最小值/最大值,也没有ZoneId 。 对于没有时间且没有时区的仅限日期的值,请使用LocalDate 。 对于没有日期且没有时区的仅限时间的值,请使用LocalTime 。 对于没有时区的日期时间,请使用LocalDateTime

以下是所有预定义的常量。

  • Instant.MIN = -1000000000-01-01T00:00Z
    Instant.MAX = 1000000000-12-31T23:59:59.999999999Z
  • OffsetDateTime.MIN = -999999999-01-01T00:00:00+18:00
    OffsetDateTime.MAX = +999999999-12-31T23:59:59.999999999-18:00
  • LocalDate.MIN = -999999999-01-01
    LocalDate.MAX = +999999999-12-31
  • LocalTime.MIN = 00:00
    23:59:59.999999999 = 23:59:59.999999999
  • LocalDateTime.MIN = -999999999-01-01T00:00:00
    LocalDateTime.MAX = +999999999-12-31T23:59:59.999999999
  • Year.MIN_VALUE = -999,999,999
    Year.MAX_VALUE = +999,999,999
  • ZoneOffset.MIN = -18:00 (但实际上是-12:00
    ZoneOffset.MAX = +18:00 (但实际上是+14:00

注意:要小心使用这些值作为某种标志或特殊含义。 许多其他软件库和数据库可能不支持这些极端值。

对于一个标志或特殊意义,如非空“没有价值”,我建议选择一个任意的时刻,但避免在时间上向后或向前进入这样的极端。 也许是Unix纪元的参考日期 ,1970年的第一个时刻,UTC,1970-01-01T00:00:00Z。 在Java中定义为常量: Instant.EPOCH


关于java.time

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

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。

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

从哪里获取java.time类?

  • Java SE 8Java SE 9Java SE 10及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6Java SE 7
    • 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
  • Android的
    • 更高版本的Android捆绑java.time类的实现。
    • 对于早期的Android(<26), ThreeTenABP项目采用ThreeTen-Backport (如上所述)。 请参见如何使用ThreeTenABP ….

ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的课程,如IntervalYearWeekYearQuarter等。