Module  java.base
软件包  java.time

Class MonthDay

  • All Implemented Interfaces:
    SerializableComparable<MonthDay>TemporalAccessorTemporalAdjuster


    public final class MonthDay
    extends Object
    implements TemporalAccessor, TemporalAdjuster, Comparable<MonthDay>, Serializable
    ISO- --12-03 ,如--12-03

    MonthDay是一个不可变的日期时间对象,代表一个月和一个月的组合。 可以获得可以从月和日派生的任何字段,例如四分之一年份。

    该类不存储或代表一年,一个或多个时区。 例如,值“12月3日”可以存储在MonthDay

    由于MonthDay不具有一年,所以2月29日的闰天被认为是有效的。

    该类实现TemporalAccessor而不是Temporal 这是因为无法定义2月29日是否有效,没有外部信息,阻止执行加/减。 与此相关, MonthDay仅提供对查询的访问权限,并设置字段MONTH_OF_YEARDAY_OF_MONTH

    ISO-8601日历系统是当今世界绝大多数的现代民用日历系统。 它相当于今天的闰年规则一直适用于日常生活的公历日历系统。 对于今天写的大多数应用,ISO-8601规则是完全合适的。 然而,任何利用历史日期并要求它们准确的应用程序都将发现ISO-8601方法不合适。

    这是一个value-based课; MonthDay实例的使用身份敏感操作(包括引用等式( == ),身份哈希代码或同步)可能会产生不可预测的结果,应该避免。 equals方法应用于比较。

    实现要求:
    这个类是不可变的和线程安全的。
    从以下版本开始:
    1.8
    另请参见:
    Serialized Form
    • 方法详细信息

      • now

        public static MonthDay now​()
        从默认时区的系统时钟获取当前月日。

        这将查询默认时区中的system clock以获取当前的月日。

        使用此方法将阻止使用备用时钟进行测试,因为时钟是硬编码的。

        结果
        当前月日使用系统时钟和默认时区,不为空
      • now

        public static MonthDay now​(ZoneId zone)
        从指定时区的系统时钟获取当前的月日。

        这将查询system clock获取当前的月日。 指定时区可以避免对默认时区的依赖。

        使用此方法将阻止使用备用时钟进行测试,因为时钟是硬编码的。

        参数
        zone - 要使用的区域ID,不为空
        结果
        当前月日使用系统时钟,不为空
      • now

        public static MonthDay now​(Clock clock)
        从指定的时钟获取当前的月日。

        这将查询指定的时钟以获取当前的月日。 使用此方法可以使用备用时钟进行测试。 可以使用dependency injection引入备用时钟。

        参数
        clock - 要使用的时钟,不为空
        结果
        当前月日,不为空
      • of

        public static MonthDay of​(Month month,
                                  int dayOfMonth)
        获得MonthDay的实例。

        闰年内的月份必须有效。 因此,二月二十九日是有效的。

        例如,四月和第三十一日的通行将会引起例外,因为在任何一年都不可能有4月31日。 相比之下,允许在二月二十九日过境,因为这个月日有时是有效的。

        参数
        month - 代表的月份,不为null
        dayOfMonth - 代表从1到31的月份
        结果
        月日,不为空
        异常
        DateTimeException - 如果任何字段的值超出范围,或者月的日期对于该月无效
      • of

        public static MonthDay of​(int month,
                                  int dayOfMonth)
        获得MonthDay的实例。

        闰年内的月份必须有效。 因此,在第2月(2月),第29天有效。

        例如,在4月(4月)和第31天通过将会发生例外,因为任何一年都不可能是4月31日。 相比之下,允许在二月二十九日过境,因为这个月日有时是有效的。

        参数
        month - 从1月1日至12日(12月)的月份,
        dayOfMonth - 代表从1到31的月份
        结果
        月日,不为空
        异常
        DateTimeException - 如果任何字段的值超出范围,或者月的日期对于该月无效
      • from

        public static MonthDay from​(TemporalAccessor temporal)
        从时间对象获取一个MonthDay的实例。

        这将基于指定的时间获得一个月日。 A TemporalAccessor表示任意的日期和时间信息集,该工厂转换为MonthDay一个实例。

        该转换提取了MONTH_OF_YEARDAY_OF_MONTH字段。 只有当时间对象具有ISO年表,或者可以转换为LocalDate ,才允许提取。

        该方法匹配功能接口TemporalQuery的签名,允许其通过方法参考MonthDay::from用作查询。

        参数
        temporal - 要转换的时间对象,不为null
        结果
        月日,不为空
        异常
        DateTimeException - 如果无法转换为 MonthDay
      • parse

        public static MonthDay parse​(CharSequence text)
        从文本字符串(例如--12-03获取MonthDay的实例。

        字符串必须表示有效的日期。 格式为--MM-dd

        参数
        text - 要解析的文本,例如“--12-03”,不为null
        结果
        解析的月日,不为空
        异常
        DateTimeParseException - 如果文本无法解析
      • parse

        public static MonthDay parse​(CharSequence text,
                                     DateTimeFormatter formatter)
        使用特定的格式化程序从文本字符串获取MonthDay的实例。

        使用格式化程序解析文本,返回一个月的日子。

        参数
        text - 要解析的文本,不为空
        formatter - 要使用的格式化程序,不为null
        结果
        解析的月日,不为空
        异常
        DateTimeParseException - 如果文本无法解析
      • isSupported

        public boolean isSupported​(TemporalField field)
        检查指定的字段是否受支持。

        这将检查是否可以查询指定字段的这个月日。 如果是false,那么调用rangeget方法会抛出异常。

        如果该字段是一个ChronoField那么查询是在这里实现的。 支持的字段有:

        • MONTH_OF_YEAR
        • YEAR
        所有其他ChronoField实例将返回false。

        如果该字段是不是一个ChronoField ,则此方法的结果是通过调用得到TemporalField.isSupportedBy(TemporalAccessor)传递this作为参数。 字段是否受支持由字段决定。

        Specified by:
        isSupported在接口 TemporalAccessor
        参数
        field - 要检查的字段,null返回false
        结果
        如果在这个月的日子里支持该字段,则为true,否则为false
      • range

        public ValueRange range​(TemporalField field)
        获取指定字段的有效值的范围。

        范围对象表示字段的最小和最大有效值。 这个月份用于提高返回范围的准确性。 如果不可能返回范围,因为该字段不受支持或出于某种其他原因,则抛出异常。

        如果该字段是一个ChronoField那么查询是在这里实现的。 supported fields将返回适当的范围实例。 所有其他ChronoField实例将抛出一个UnsupportedTemporalTypeException

        如果该字段是不是一个ChronoField ,则此方法的结果是通过调用得到TemporalField.rangeRefinedBy(TemporalAccessor)传递this作为参数。 是否可以获得范围由字段确定。

        Specified by:
        range在接口 TemporalAccessor
        参数
        field - 查询范围的字段,不为null
        结果
        字段的有效值的范围不为null
        异常
        DateTimeException - 如果无法获得该字段的范围
        UnsupportedTemporalTypeException - 如果不支持该字段
      • get

        public int get​(TemporalField field)
        从这个月份获取指定字段的值作为int

        这个月的日子会查询指定字段的值。 返回的值将始终在该字段的值的有效范围内。 如果不可能返回值,因为该字段不受支持或出于某种其他原因,则抛出异常。

        如果该字段是一个ChronoField那么查询是在这里实现的。 supported fields将根据本月日返回有效值。 所有其他ChronoField实例将抛出一个UnsupportedTemporalTypeException

        如果该字段是不是一个ChronoField ,则此方法的结果是通过调用得到TemporalField.getFrom(TemporalAccessor)传递this作为参数。 该值是否可以获得,该值代表什么值由该字段决定。

        Specified by:
        get在接口 TemporalAccessor
        参数
        field - 要获取的字段,不为null
        结果
        该字段的值
        异常
        DateTimeException - 如果无法获取字段的值,或者该值超出了该字段的有效值的范围
        UnsupportedTemporalTypeException - 如果该字段不受支持或值的范围超过 int
        ArithmeticException - 如果发生数字溢出
      • getLong

        public long getLong​(TemporalField field)
        从这个月份的日期获取指定字段的值作为long

        这个月的日子会查询指定字段的值。 如果不可能返回值,因为该字段不受支持或出于某种其他原因,则抛出异常。

        如果该字段是一个ChronoField那么查询是在这里实现的。 supported fields将根据本月日返回有效值。 所有其他ChronoField实例将抛出一个UnsupportedTemporalTypeException

        如果该字段是不是一个ChronoField ,则此方法的结果是通过调用得到TemporalField.getFrom(TemporalAccessor)传递this作为参数。 该值是否可以获得,该值代表什么值由该字段决定。

        Specified by:
        getLong在接口 TemporalAccessor
        参数
        field - 要获取的字段,不为null
        结果
        该字段的值
        异常
        DateTimeException - 如果无法获取该字段的值
        UnsupportedTemporalTypeException - 如果该字段不被支持
        ArithmeticException - 如果发生数字溢出
      • getMonthValue

        public int getMonthValue​()
        将月份字段从1到12。

        此方法将一个月从int从1到12返回。如果通过调用getMonth()使用枚举Month应用程序代码通常更清晰。

        结果
        从1到12年的月份
        另请参见:
        getMonth()
      • getMonth

        public Month getMonth​()
        使用Month枚举获取月份字段。

        此方法返回本月的枚举Month 这避免了int值意味着什么的混乱。 如果您需要访问原始的int值,则枚举将提供int value

        结果
        月份,不为零
        另请参见:
        getMonthValue()
      • getDayOfMonth

        public int getDayOfMonth​()
        获取月份字段。

        此方法返回int值。

        结果
        从1到31日
      • isValidYear

        public boolean isValidYear​(int year)
        检查年份是否适用于本月。

        此方法检查此月和日以及输入年份是否形成有效日期。 这只能在二月二十九日返回假。

        参数
        year - 验证年份
        结果
        如果该年份适用于本月的日期,则为真
        另请参见:
        Year.isValidMonthDay(MonthDay)
      • withMonth

        public MonthDay withMonth​(int month)
        返回这个MonthDay的副本, MonthDay更改月。

        这将返回指定月份的一个月日。 如果指定月份的日期无效,则日期将被调整到最后一个有效的日期。

        此实例是不可变的,不受此方法调用的影响。

        参数
        month - 从1月(1月)至12月(12月)返回的月日设定的月份
        结果
        一个 MonthDay基于这个月份与请求的月份,不为null
        异常
        DateTimeException - 如果月份值无效
      • with

        public MonthDay with​(Month month)
        返回这个MonthDay的副本,并更改月份。

        这将返回指定月份的一个月日。 如果指定月份的日期无效,则日期将被调整到最后一个有效的日期。

        此实例是不可变的,不受此方法调用的影响。

        参数
        month - 在返回的月日设置的月份,不为null
        结果
        一个 MonthDay基于这个月份与请求的月份,不为null
      • withDayOfMonth

        public MonthDay withDayOfMonth​(int dayOfMonth)
        返回此MonthDay的副本,并更改日期。

        这将返回具有指定日期的月日。 如果当月的日期无效,则抛出异常。

        此实例是不可变的,不受此方法调用的影响。

        参数
        dayOfMonth - 返回月日,从1到31的月份
        结果
        一个 MonthDay基于这个月日的请求日,不为null
        异常
        DateTimeException - 如果月日的价值无效,或者月的日期对于该月无效
      • query

        public <R> R query​(TemporalQuery<R> query)
        使用指定的查询查询此月日。

        这使用指定的查询策略对象查询本月。 TemporalQuery对象定义了用于获取结果的逻辑。 阅读查询的文档,以了解该方法的结果。

        该方法的结果是通过对通过this作为参数的指定查询调用TemporalQuery.queryFrom(TemporalAccessor)方法获得的。

        Specified by:
        query在接口 TemporalAccessor
        参数类型
        R - 结果的类型
        参数
        query - 要调用的查询,不为空
        结果
        查询结果可能返回null(由查询定义)
        异常
        DateTimeException - 如果无法查询(由查询定义)
        ArithmeticException - 如果发生数字溢出(由查询定义)
      • adjustInto

        public Temporal adjustInto​(Temporal temporal)
        将指定的时间对象调整为具有这个月日。

        这将返回与月份和日期的输入相同的可观察类型的时间对象,与之相同。

        调整相当于使用Temporal.with(TemporalField, long)两次,通过ChronoField.MONTH_OF_YEARChronoField.DAY_OF_MONTH作为字段。 如果指定的时间对象不使用ISO日历系统,则抛出DateTimeException

        在大多数情况下,通过使用Temporal.with(TemporalAdjuster)更正呼叫模式:

          // these two lines are equivalent, but the second approach is recommended
           temporal = thisMonthDay.adjustInto(temporal);
           temporal = temporal.with(thisMonthDay); 

        此实例是不可变的,不受此方法调用的影响。

        Specified by:
        adjustInto在接口 TemporalAdjuster
        参数
        temporal - 要调整的目标对象,不为null
        结果
        调整对象,不为null
        异常
        DateTimeException - 如果不能进行调整
        ArithmeticException - 如果发生数字溢出
      • format

        public String format​(DateTimeFormatter formatter)
        使用指定的格式化程序格式化本月。

        这个月的日子将传递给格式化程序来生成一个字符串。

        参数
        formatter - 使用的格式化程序,不为null
        结果
        格式化的日期字符串,不为空
        异常
        DateTimeException - 打印时是否发生错误
      • atYear

        public LocalDate atYear​(int year)
        结合本月与一年创造LocalDate

        这将返回一个LocalDate形成从这个月 - 日和指定年份。

        如果这一年不是闰年,那么2月29日的一个月的日子将会调整到2月28日。

        此实例是不可变的,不受此方法调用的影响。

        参数
        year - 从MIN_YEAR到MAX_YEAR的使用年数
        结果
        从本月和指定年份形成的当地日期,不为空
        异常
        DateTimeException - 如果年度在有效范围之外
      • compareTo

        public int compareTo​(MonthDay other)
        比较这个月份到另一个月的日子。

        比较首先是基于月份的价值,然后是当天的价值。 它与“等于”一致,如Comparable所定义。

        Specified by:
        compareTo在接口 Comparable<MonthDay>
        参数
        other - 与其他月相比,不为null
        结果
        比较器值为负,如果较小,则如果较大则为正
      • isAfter

        public boolean isAfter​(MonthDay other)
        检查这个月日是否在指定的月日之后。
        参数
        other - 与其他月相比,不为空
        结果
        如果这是在指定的月日之后,则为真
      • isBefore

        public boolean isBefore​(MonthDay other)
        检查这个月日是否在指定的月日之前。
        参数
        other - 与其他月相比,不为空
        结果
        如果这一点在指定的月日之前,则为true
      • equals

        public boolean equals​(Object obj)
        检查这个月日是否等于另一个月 - 日。

        比较是基于一年内的月日的时间位置。

        重写:
        equalsObject
        参数
        obj - 要检查的对象,null返回false
        结果
        如果这等于其他月日,则为真
        另请参见:
        Object.hashCode()HashMap
      • toString

        public String toString​()
        String输出这个月的日子,如--12-03

        输出格式为--MM-dd

        重写:
        toStringObject
        结果
        这个月份的字符串表示,不为null