Module java.base
Package java.time

Class MonthDay

java.lang.Object
java.time.MonthDay
所有已实现的接口:
Serializable, Comparable<MonthDay>, TemporalAccessor, TemporalAdjuster

public final class MonthDay extends Object implements TemporalAccessor, TemporalAdjuster, Comparable<MonthDay>, Serializable
ISO-8601日历系统中的一个月日,例如--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方法不适用。

这是一个基于值的类;程序员应将相等的实例视为可互换,并且不应将实例用于同步,否则可能会发生不可预测的行为。例如,在将来的版本中,同步可能会失败。应使用equals方法进行比较。

实现要求:
此类是不可变的且线程安全的。
自:
1.8
参见:
  • Method Details

    • now

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

      这将查询默认时区中的系统时钟以获取当前月日。

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

      返回:
      使用系统时钟和默认时区获取当前月日,不为null
    • now

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

      这将查询系统时钟以获取当前月日。指定时区可避免依赖默认时区。

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

      参数:
      zone - 要使用的区域ID,不为null
      返回:
      使用系统时钟获取当前月日,不为null
    • now

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

      这将查询指定的时钟以获取当前月日。使用此方法允许使用替代时钟进行测试。可以使用依赖注入引入替代时钟。

      参数:
      clock - 要使用的时钟,不为null
      返回:
      当前月日,不为null
    • of

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

      日期必须在闰年内对应的月份有效。因此,对于2月,29日是有效的。

      例如,传入4月和31日将引发异常,因为任何年份中都不可能有4月31日。相比之下,传入2月29日是允许的,因为该月日有时是有效的。

      参数:
      month - 要表示的年份,不为null
      dayOfMonth - 要表示的日期,从1到31
      返回:
      月日,不为null
      抛出:
      DateTimeException - 如果任何字段的值超出范围,或者日期对于该月份无效
    • of

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

      日期必须在闰年内对应的月份有效。因此,对于2月(February),29日是有效的。

      例如,传入月份4(April)和日期31将引发异常,因为任何年份中都不可能有4月31日。相比之下,传入2月29日是允许的,因为该月日有时是有效的。

      参数:
      month - 要表示的年份,从1(一月)到12(十二月)
      dayOfMonth - 要表示的日期,从1到31
      返回:
      月日,不为null
      抛出:
      DateTimeException - 如果任何字段的值超出范围,或者日期对于该月份无效
    • from

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

      根据指定的时间获取一个月日。 TemporalAccessor表示一组任意的日期和时间信息,此工厂将其转换为MonthDay的实例。

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

      此方法与函数接口TemporalQuery的签名匹配,允许通过方法引用MonthDay::from来使用它作为查询。

      参数:
      temporal - 要转换的时间对象,不为null
      返回:
      月日,不为null
      抛出:
      DateTimeException - 如果无法转换为MonthDay
    • parse

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

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

      参数:
      text - 要解析的文本,例如“--12-03”,不为null
      返回:
      解析的月日,不为null
      抛出:
      DateTimeParseException - 如果无法解析文本
    • parse

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

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

      参数:
      text - 要解析的文本,不为null
      formatter - 要使用的格式化程序,不为null
      返回:
      解析的月日,不为null
      抛出:
      DateTimeParseException - 如果无法解析文本
    • isSupported

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

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

      如果字段是一个ChronoField,则在此处实现查询。支持的字段包括:

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

      如果字段不是ChronoField,则通过将this作为参数传递给TemporalField.isSupportedBy(TemporalAccessor)来获取此方法的结果。字段是否受支持由字段决定。

      指定者:
      isSupported 在接口 TemporalAccessor
      参数:
      field - 要检查的字段,null返回false
      返回:
      如果此月-日支持该字段,则为true,否则为false
    • range

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

      范围对象表示字段的最小和最大有效值。此月-日用于增强返回范围的准确性。如果无法返回范围,因为不支持该字段或出于其他原因,将抛出异常。

      如果字段是一个ChronoField,则在此处实现查询。支持的字段将返回适当的范围实例。所有其他ChronoField实例将抛出UnsupportedTemporalTypeException

      如果字段不是ChronoField,则通过将this作为参数传递给TemporalField.rangeRefinedBy(TemporalAccessor)来获取此方法的结果。是否可以获取范围由字段决定。

      指定者:
      range 在接口 TemporalAccessor
      参数:
      field - 要查询范围的字段,不能为空
      返回:
      字段的有效值范围,不能为空
      抛出:
      DateTimeException - 如果无法获取字段的范围
      UnsupportedTemporalTypeException - 如果不支持该字段
    • get

      public int get(TemporalField field)
      从此月-日获取指定字段的值作为int

      查询此月-日以获取指定字段的值。返回的值将始终在字段的有效值范围内。如果无法返回值,因为不支持该字段或出于其他原因,将抛出异常。

      如果字段是一个ChronoField,则在此处实现查询。支持的字段将根据此月-日返回有效值。所有其他ChronoField实例将抛出UnsupportedTemporalTypeException

      如果字段不是ChronoField,则通过将this作为参数传递给TemporalField.getFrom(TemporalAccessor)来获取此方法的结果。是否可以获取值以及值代表什么由字段决定。

      指定者:
      get 在接口 TemporalAccessor
      参数:
      field - 要获取的字段,不能为空
      返回:
      字段的值
      抛出:
      DateTimeException - 如果无法获取字段的值或值超出字段的有效值范围
      UnsupportedTemporalTypeException - 如果不支持该字段或值范围超出int
      ArithmeticException - 如果发生数值溢出
    • getLong

      public long getLong(TemporalField field)
      从此月-日获取指定字段的值作为long

      查询此月-日以获取指定字段的值。如果无法返回值,因为不支持该字段或出于其他原因,将抛出异常。

      如果字段是一个ChronoField,则在此处实现查询。支持的字段将根据此月-日返回有效值。所有其他ChronoField实例将抛出UnsupportedTemporalTypeException

      如果字段不是ChronoField,则通过将this作为参数传递给TemporalField.getFrom(TemporalAccessor)来获取此方法的结果。是否可以获取值以及值代表什么由字段决定。

      指定者:
      getLong 在接口 TemporalAccessor
      参数:
      field - 要获取的字段,不能为空
      返回:
      字段的值
      抛出:
      DateTimeException - 如果无法获取字段的值
      UnsupportedTemporalTypeException - 如果不支持该字段
      ArithmeticException - 如果发生数值溢出
    • getMonthValue

      public int getMonthValue()
      获取月份字段从1到12。

      此方法将月份作为int从1到12返回。通过调用getMonth()使用枚举Month,应用代码通常更清晰。

      返回:
      月份,从1到12
      参见:
    • getMonth

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

      此方法返回月份的枚举Month。这样可以避免对int值的含义产生混淆。如果需要访问基本int值,则枚举提供了int value

      返回:
      月份,不能为空
      参见:
    • getDayOfMonth

      public int getDayOfMonth()
      获取月份字段的日期。

      此方法返回日期的基本int值。

      返回:
      日期,从1到31
    • isValidYear

      public boolean isValidYear(int year)
      检查该月-日是否对应于指定年份。

      此方法检查该月和日以及输入年份是否形成有效日期。仅当为2月29日时才会返回false。

      参数:
      year - 要验证的年份
      返回:
      如果该年份对应于该月-日,则为true
      参见:
    • withMonth

      public MonthDay withMonth(int month)
      返回具有更改月份字段的MonthDay的副本。

      返回具有指定月份的月-日。如果指定月份的日期无效,则日期将调整为该月的最后一个有效日期。

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

      参数:
      month - 要在返回的月-日中设置的月份,从1(一月)到12(十二月)
      返回:
      基于此月-日的具有请求月份的MonthDay,不能为空
      抛出:
      DateTimeException - 如果月份值无效
    • with

      public MonthDay with(Month month)
      返回具有更改月份字段的MonthDay的副本。

      返回具有指定月份的月-日。如果指定月份的日期无效,则日期将调整为该月的最后一个有效日期。

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

      参数:
      month - 要在返回的月-日中设置的月份,不能为空
      返回:
      基于此月-日的具有请求月份的MonthDay,不能为空
    • withDayOfMonth

      public MonthDay withDayOfMonth(int dayOfMonth)
      返回具有更改日期字段的MonthDay的副本。

      返回具有指定日期的月-日。如果日期对于该月份无效,则抛出异常。

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

      参数:
      dayOfMonth - 要设置在返回月日中的日,从1到31
      返回:
      基于此月日的MonthDay,具有请求的日,不为null
      抛出:
      DateTimeException - 如果日值无效,或者如果日对于该月份无效
    • query

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

      使用指定的查询策略对象查询此月日。 TemporalQuery对象定义要用于获取结果的逻辑。阅读查询的文档以了解此方法的结果将是什么。

      此方法的结果是通过在指定的查询上调用TemporalQuery.queryFrom(TemporalAccessor)方法并将this作为参数传递来获得的。

      指定者:
      query 在接口 TemporalAccessor
      类型参数:
      R - 结果的类型
      参数:
      query - 要调用的查询,不为null
      返回:
      查询结果,可能返回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)来反转调用模式更清晰:

         // 这两行是等效的,但推荐第二种方法
         temporal = thisMonthDay.adjustInto(temporal);
         temporal = temporal.with(thisMonthDay);
       

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

      指定者:
      adjustInto 在接口 TemporalAdjuster
      参数:
      temporal - 要调整的目标对象,不为null
      返回:
      调整后的对象,不为null
      抛出:
      DateTimeException - 如果无法进行调整
      ArithmeticException - 如果发生数值溢出
    • format

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

      此月日将传递给格式化程序以生成一个字符串。

      参数:
      formatter - 要使用的格式化程序,不为null
      返回:
      格式化的月日字符串,不为null
      抛出:
      DateTimeException - 如果在打印过程中发生错误
    • atYear

      public LocalDate atYear(int year)
      将此月日与年份组合以创建一个LocalDate

      从此月日和指定年份形成一个LocalDate

      如果年份不是闰年,则2月29日将调整为结果日期中的2月28日。

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

      参数:
      year - 要使用的年份,从MIN_YEAR到MAX_YEAR
      返回:
      从此月日和指定年份形成的本地日期,不为null
      抛出:
      DateTimeException - 如果年份超出有效年份范围
    • compareTo

      public int compareTo(MonthDay other)
      将此月日与另一个月日进行比较。

      比较首先基于月的值,然后基于日的值。它是“与equals一致”的,如Comparable定义的。

      指定者:
      compareTo 在接口 Comparable<MonthDay>
      参数:
      other - 要比较的另一个月日,不为null
      返回:
      比较器值,如果此在other之前,则小于零,如果它们相等,则为零,如果此在other之后,则大于零
      参见:
    • isAfter

      public boolean isAfter(MonthDay other)
      检查此月日是否在指定的月日之后。
      参数:
      other - 要比较的另一个月日,不为null
      返回:
      如果此在指定的月日之后,则为true
    • isBefore

      public boolean isBefore(MonthDay other)
      检查此月日是否在指定的月日之前。
      参数:
      other - 要比较的另一个月日,不为null
      返回:
      如果此点在指定的月日之前,则为true
    • equals

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

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

      覆盖:
      equals 在类 Object
      参数:
      obj - 要检查的对象,null返回false
      返回:
      如果此等于另一个月日,则为true
      参见:
    • hashCode

      public int hashCode()
      此月日的哈希码。
      覆盖:
      hashCode 在类 Object
      返回:
      适当的哈希码
      参见:
    • toString

      public String toString()
      将此月日输出为String,例如--12-03

      输出将以--MM-dd的格式:

      覆盖:
      toString 在类 Object
      返回:
      此月日的字符串表示,不为null