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.Date
, Calendar
和SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是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增加了一些小function和修复。
- Java SE 6和Java 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的试验场。 您可以在这里找到一些有用的课程,如Interval
, YearWeek
, YearQuarter
等。