【问题标题】:Java: What/where are the maximum and minimum values of a GregorianCalendar?Java:GregorianCalendar 的最大值和最小值是什么/在哪里?
【发布时间】:2011-01-24 11:33:09
【问题描述】:

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

它们是像 Integer.MAX_VALUE 这样的常量,还是 GregorianCalendar.get(BLAH)?

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

【问题讨论】:

    标签: java calendar gregorian-calendar


    【解决方案1】:

    这应该可行:

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

    【讨论】:

    • 很遗憾,您的解决方案不起作用。在 mingc.setTime(new Date(Long.MIN_VALUE)) 之后,你会得到: migc.get(Calendar.YEAR) == 292269055 或类似这样的东西。对我来说,这听起来不像是一分钟:-)。
    • 谢谢 =D 我只是使用这些值进行比较,所以我很好,但对于其他人来说,这可能值得一提。来自 setTime() 文档:注意:使用 Date(Long.MAX_VALUE) 或 Date(Long.MIN_VALUE) 调用 setTime() 可能会从 get() 中产生不正确的字段值。
    • pajton,检查一下:migc.get(Calendar.ERA) 0 表示 BC 1 表示 AD 所以年份 292269055 对应于 292269055 BC
    • 对。这实际上很聪明;-)
    • 最好使用new Date(0) 作为最短日期。
    【解决方案2】:

    我接受了 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。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        java.time

        旧的日期时间类(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

        以下都是预定义的常量。

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

        对于标志或特殊含义,例如非空“无可用值”,我建议选择任意时刻,但避免在时间上向后或向前走极端。也许Unix epoch reference date,1970 年 UTC 的第一刻,1970-01-01T00:00:00Z。在 Java 中定义为常量:Instant.EPOCH


        关于java.time

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

        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 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

        【讨论】:

          猜你喜欢
          • 2020-09-06
          • 2015-05-19
          • 1970-01-01
          • 2023-04-02
          • 2019-10-20
          • 1970-01-01
          • 2016-04-10
          • 2019-01-09
          相关资源
          最近更新 更多