【发布时间】:2011-01-24 11:33:09
【问题描述】:
公历日历的最大值和最小值是多少?
它们是像 Integer.MAX_VALUE 这样的常量,还是 GregorianCalendar.get(BLAH)?
简而言之,如何创建具有最小值/最大值的 GregorianCalendar 实例?
【问题讨论】:
标签: java calendar gregorian-calendar
公历日历的最大值和最小值是多少?
它们是像 Integer.MAX_VALUE 这样的常量,还是 GregorianCalendar.get(BLAH)?
简而言之,如何创建具有最小值/最大值的 GregorianCalendar 实例?
【问题讨论】:
标签: java calendar gregorian-calendar
这应该可行:
GregorianCalendar maxgc = new GregorianCalendar();
maxgc.setTime(new Date(Long.MAX_VALUE));
GregorianCalendar mingc = new GregorianCalendar();
mingc.setTime(new Date(Long.MIN_VALUE));
【讨论】:
migc.get(Calendar.ERA) 0 表示 BC 1 表示 AD 所以年份 292269055 对应于 292269055 BC
new Date(0) 作为最短日期。
我接受了 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.util.Date/.Calendar 等)已被 Java 8 及更高版本中内置的 java.time 框架所取代。
java.time 类的灵感来自 Joda-Time,由 JSR 310 定义,由 ThreeTen-Extra 项目扩展,由 ThreeTen-Backport 项目向后移植到 Java 6 和 7,并在ThreeTenABP 项目。见Tutorial。
在UTC 的时间线上,分辨率为nanoseconds,请使用Instant。给定offset-from-UTC,使用OffsetDateTime。对于time zone(偏移量+异常规则),使用ZonedDateTime,但本质上没有定义最小值/最大值,ZoneId 也没有。对于没有时间和时区的仅日期值,请使用LocalDate。对于不带日期和不带时区的仅时间值,请使用LocalTime。对于没有时区的日期时间,请使用LocalDateTime。
以下都是预定义的常量。
Instant.MIN = -1000000000-01-01T00:00ZInstant.MAX = 1000000000-12-31T23:59:59.999999999Z
OffsetDateTime.MIN = -999999999-01-01T00:00:00+18:00OffsetDateTime.MAX = +999999999-12-31T23:59:59.999999999-18:00
LocalDate.MIN = -999999999-01-01LocalDate.MAX = +999999999-12-31
LocalTime.MIN = 00:00LocalTime.MAX = 23:59:59.999999999
LocalDateTime.MIN = -999999999-01-01T00:00:00LocalDateTime.MAX = +999999999-12-31T23:59:59.999999999
Year.MIN_VALUE = -999,999,999Year.MAX_VALUE = +999,999,999
ZoneOffset.MIN = -18:00(但实际上是-12:00)ZoneOffset.MAX = +18:00(但实际上是+14:00)警告:小心将这些值用作某种标志或特殊含义。许多其他软件库和数据库可能不支持这些极端值。
对于标志或特殊含义,例如非空“无可用值”,我建议选择任意时刻,但避免在时间上向后或向前走极端。也许Unix epoch reference date,1970 年 UTC 的第一刻,1970-01-01T00:00:00Z。在 Java 中定义为常量:Instant.EPOCH
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。
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 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。
【讨论】: