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

Java: What/where are the maximum and minimum values of a GregorianCalendar?

公历的最大值和最小值是多少?

它们是在一个像integer.max_值一样的常量中,还是在gregoricalendar.get(blah)中?

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


我接受了乔库特纳的建议,并用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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版。


这应该有效:

1
2
3
4
5
GregorianCalendar maxgc = new GregorianCalendar();
maxgc.setTime(new Date(Long.MAX_VALUE));

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


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


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

java.time时间

旧的DealTimes类(Java.U.L.Deal/Calm等)已经被JavaTimeFramework内置到Java 8和以后的版本中取代。

JavaTime类是由JoDA时间启发的,由JSR 310定义,由TrutEnEnter Project扩展,通过TeReTeNeN后端项目返回到Java 6和7,并适用于TruteTeNABP项目中的Android。请参见教程。

在UTC时间轴上的一瞬间,分辨率为纳秒,使用Instant。给定与UTC的偏移量,使用OffsetDateTime。对于时区(偏移量+异常规则),使用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
    LocalTime.MAX=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历元参考日期,UTC中的第一个时刻1970,1970-01-01T0:00:0:00。

关于java.time

JavaTimeFr框架是在Java 8和之后构建的。这些类取代了麻烦的旧遗留日期时间类,如java.util.DateCalendarSimpleDateFormat

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

要了解更多信息,请参阅Oracle教程。以及搜索堆栈溢出以获得许多示例和解释。规格为JSR 310。

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

在哪里获取java.time类?

  • Java SE 8、Java SE 9、Java SE 10以及以后
    • 内置。
    • 标准JAVA API的一部分与捆绑实现。
    • Java 9增加了一些次要的特性和修复。
  • Java SE 6和Java SE 7
    • 大部分JavaTimeActudio都被移植到TealEnter后端的Java 6和7中。
  • 安卓
    • java.time类的Android包实现的更高版本。
    • 对于早期的Android(<26),threetenabp项目适应threeten backport(如上所述)。看看如何使用三连珠……

threeten额外项目使用额外的类扩展java.time。这个项目是将来可能添加到java.time的一个试验场。您可以在这里找到一些有用的类,如IntervalYearWeekYearQuarter等等。