GregorianCalendar的最大值和最小值是什么?
它们是否像Integer.MAX_VALUE一样,或者可能是GregorianCalendar.get(BLAH)?
简而言之,如何创建具有最小/最大值的GregorianCalendar实例?
答案 0 :(得分:5)
这应该有效:
GregorianCalendar maxgc = new GregorianCalendar();
maxgc.setTime(new Date(Long.MAX_VALUE));
GregorianCalendar mingc = new GregorianCalendar();
mingc.setTime(new Date(Long.MIN_VALUE));
答案 1 :(得分:5)
我接受了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。
答案 2 :(得分:4)
您可以尝试为每种类型的字段(即年,月等)调用Calendar.getMinimum(),然后在相应的字段类型上设置这些最小值。这将为您提供最低日历。我不知道是否有更快的方法。
答案 3 :(得分:1)
其他答案可能是正确的,但使用过时的类。
旧的日期时间类(java.util.Date/.Calendar等)已被Java 8及更高版本中内置的java.time框架取代。
java.time类的灵感来自Joda-Time,由JSR 310定义,由ThreeTen-Extra项目扩展,后端移植到Java 6& 7由ThreeTen-Backport项目完成,并在ThreeTenABP项目中适用于Android。请参阅Tutorial。
在UTC的时间轴上片刻nanoseconds,请使用Instant
。给定offset-from-UTC后,请使用OffsetDateTime
。对于time zone(偏移+异常规则),请使用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
)< / LI>
警告:警惕将这些值用作某种旗帜或特殊含义。许多其他软件库和数据库可能不支持这些极端值。
对于一个标志或特殊含义,例如非空“无可用值”,我建议选择一个随意的时刻,但要避免在时间上向后或向前进入这样的极端。也许是Unix epoch reference date,1970年的第一个时刻,UTC,1970-01-01T00:00:00Z。在Java中定义为常量:Instant.EPOCH
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和&amp; SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。