public final class MonthDay extends Object implements TemporalAccessor, TemporalAdjuster, Comparable<MonthDay>, Serializable
--12-03
,如--12-03
。
MonthDay
是一个不变的日期时间对象,代表一年和一个月的组合。 可以获得可以从月和日派生的任何字段,例如四分之一年份。
该类不存储或代表一年,一个或多个时区。 例如,值“12月3日”可以存储在MonthDay
。
由于MonthDay
没有一年,所以2月29日的闰天被认为是有效的。
这个类实现TemporalAccessor
而不是Temporal
。 这是因为无法定义2月29日是否有效,没有外部信息,阻止执行加/减。 相关的是, MonthDay
只提供访问查询和设置字段MONTH_OF_YEAR
和DAY_OF_MONTH
。
ISO-8601日历系统是当今世界绝大多数的现代民用日历系统。 它相当于今天的闰年规则一直适用于日常生活的公历日历系统。 对于今天写的大多数应用,ISO-8601规则是完全合适的。 然而,任何利用历史日期并要求它们准确的应用程序都将发现ISO-8601方法不合适。
这是一个value-based类; 使用身份敏感的操作(包括引用相等(的==
上的实例),标识哈希码,或同步) MonthDay
可具有不可预测的结果,应当避免。 equals
方法应用于比较。
Modifier and Type | Method and Description |
---|---|
Temporal |
adjustInto(Temporal temporal)
将指定的时间对象调整为具有这个月日。
|
LocalDate |
atYear(int year)
结合本月与一年创建
LocalDate 。
|
int |
compareTo(MonthDay other)
比较这个月份到另一个月的日子。
|
boolean |
equals(Object obj)
检查这个月日是否等于另一个月 - 日。
|
String |
format(DateTimeFormatter formatter)
使用指定的格式化程序格式化本月。
|
static MonthDay |
from(TemporalAccessor temporal)
从时间对象获取一个
MonthDay 的实例。
|
int |
get(TemporalField field)
从本月的日期获取指定字段的值为
int 。
|
int |
getDayOfMonth()
获取月份字段。
|
long |
getLong(TemporalField field)
从本月的日期获取指定字段的值为
long 。
|
Month |
getMonth()
使用
Month 枚举获取月份字段。
|
int |
getMonthValue()
将月份字段从1到12。
|
int |
hashCode()
这个月的哈希码。
|
boolean |
isAfter(MonthDay other)
是在指定的月日之后的这个月份。
|
boolean |
isBefore(MonthDay other)
是在指定的月日前的这个月前一天。
|
boolean |
isSupported(TemporalField field)
检查指定的字段是否受支持。
|
boolean |
isValidYear(int year)
检查年份是否适用于本月。
|
static MonthDay |
now()
从默认时区的系统时钟获取当前月日。
|
static MonthDay |
now(Clock clock)
从指定的时钟获取当前的月日。
|
static MonthDay |
now(ZoneId zone)
从指定时区的系统时钟获取当前的月日。
|
static MonthDay |
of(int month, int dayOfMonth)
获得一个
MonthDay 的实例。
|
static MonthDay |
of(Month month, int dayOfMonth)
获得一个
MonthDay 的实例。
|
static MonthDay |
parse(CharSequence text)
从文本字符串(如
--12-03 获取一个
MonthDay 的实例。
|
static MonthDay |
parse(CharSequence text, DateTimeFormatter formatter)
使用特定的格式化
MonthDay 从文本字符串获取一个
MonthDay 的实例。
|
<R> R |
query(TemporalQuery<R> query)
使用指定的查询查询此月日。
|
ValueRange |
range(TemporalField field)
获取指定字段的有效值的范围。
|
String |
toString()
输出这个月的一天为
String ,如
--12-03 。
|
MonthDay |
with(Month month)
返回此年份更改的
MonthDay 的副本。
|
MonthDay |
withDayOfMonth(int dayOfMonth)
返回此
MonthDay 的副本。
|
MonthDay |
withMonth(int month)
返回该年份更改的
MonthDay 的副本。
|
public static MonthDay now()
public static MonthDay now(Clock clock)
这将查询指定的时钟以获取当前的月日。 使用此方法可以使用备用时钟进行测试。 替代时钟可以使用dependency injection
引入 。
clock
- 要使用的时钟,不为空
public static MonthDay of(Month month, int dayOfMonth)
MonthDay
的实例。
闰年内的月份必须有效。 因此,二月二十九日是有效的。
例如,四月和第三十一日的通行将会引起例外,因为在任何一年都不可能有4月31日。 相比之下,允许在二月二十九日过境,因为这个月日有时是有效的。
month
- 代表的月份,不为null
dayOfMonth
- 代表从1到31的月份
DateTimeException
- 如果任何字段的值超出范围,或月的日期对于该月无效
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
- 如果任何字段的值超出范围,或者月的日期对于该月无效
public static MonthDay from(TemporalAccessor temporal)
MonthDay
的实例。
这将基于指定的时间获得一个月日。 A TemporalAccessor
表示日期和时间信息的任意集合,该工厂将转换为MonthDay
一个实例。
该转换提取了MONTH_OF_YEAR
和DAY_OF_MONTH
字段。 仅当时间对象具有ISO年表,或者可以转换为LocalDate时, LocalDate
。
该方法中,功能接口的签名相匹配TemporalQuery
允许它在通过方法参考,查询中使用MonthDay::from
。
temporal
- 要转换的时间对象,不为空
DateTimeException
- 如果无法转换为
MonthDay
public static MonthDay parse(CharSequence text)
MonthDay
一个实例,例如--12-03
。
字符串必须表示有效的日期。 格式为--MM-dd
。
text
- 要解析的文本,如“--12-03”,不为空
DateTimeParseException
- 如果文本无法解析
public static MonthDay parse(CharSequence text, DateTimeFormatter formatter)
MonthDay
从文本字符串获取一个MonthDay
的实例。
使用格式化程序解析文本,返回一个月的日子。
text
- 要解析的文本,不为null
formatter
- 要使用的格式化程序,不为null
DateTimeParseException
- 如果文本无法解析
public boolean isSupported(TemporalField field)
这将检查是否可以查询指定字段的这个月日。 如果是false,那么调用range
和get
方法会抛出异常。
如果该字段是ChronoField
,那么查询是在这里实现的。 支持的字段有:
MONTH_OF_YEAR
YEAR
ChronoField
实例将返回false。
如果该字段是不是一个ChronoField
,则此方法的结果是通过调用获得TemporalField.isSupportedBy(TemporalAccessor)
传递this
作为参数。 字段是否受支持由字段决定。
isSupported
在界面
TemporalAccessor
field
- 要检查的字段,null返回false
public ValueRange range(TemporalField field)
范围对象表示字段的最小和最大有效值。 这个月份用于提高返回范围的准确性。 如果不可能返回范围,因为该字段不受支持或出于某种其他原因,则抛出异常。
如果该字段是ChronoField
,那么查询是在这里实现的。 supported fields
将返回适当的范围实例。 所有其他ChronoField
实例将抛出一个UnsupportedTemporalTypeException
。
如果该字段不是ChronoField
,则通过调用TemporalField.rangeRefinedBy(TemporalAccessor)
this
作为参数的this
获得该方法的结果。 是否可以获得范围由字段确定。
range
在界面
TemporalAccessor
field
- 查询范围的字段,不为null
DateTimeException
- 如果不能获得该字段的范围
UnsupportedTemporalTypeException
- 如果该字段不被支持
public int get(TemporalField field)
int
。
这个月份的日期会查询指定字段的值。 返回的值将始终在该字段的值的有效范围内。 如果不可能返回值,因为该字段不受支持或出于某种其他原因,则抛出异常。
如果该字段是ChronoField
,那么查询是在这里实现的。 supported fields
将返回基于本月的有效值。 所有其他ChronoField
实例将抛出一个UnsupportedTemporalTypeException
。
如果该字段是不是一个ChronoField
,则此方法的结果是通过调用获得TemporalField.getFrom(TemporalAccessor)
传递this
作为参数。 该值是否可以获得,该值代表什么值由该字段决定。
get
在界面
TemporalAccessor
field
- 要获取的字段,不为null
DateTimeException
- 如果无法获取该字段的值或该值超出该字段的有效值的范围
UnsupportedTemporalTypeException
- 如果该字段不被支持或值的范围超过
int
ArithmeticException
- 如果发生数字溢出
public long getLong(TemporalField field)
long
。
这个月份的日期会查询指定字段的值。 如果不可能返回值,因为该字段不受支持或出于某种其他原因,则抛出异常。
如果该字段是ChronoField
,那么查询在这里实现。 supported fields
将根据本月日返回有效值。 所有其他ChronoField
实例将抛出一个UnsupportedTemporalTypeException
。
如果该字段不是ChronoField
,则通过调用TemporalField.getFrom(TemporalAccessor)
this
作为参数的this
获得该方法的结果。 该值是否可以获得,该值代表什么值由该字段决定。
getLong
在界面
TemporalAccessor
field
- 要获取的字段,不为null
DateTimeException
- 如果无法获取字段的值
UnsupportedTemporalTypeException
- 如果该字段不被支持
ArithmeticException
- 如果发生数字溢出
public int getMonthValue()
此方法将一个月作为int
从1到12返回。如果通过调用getMonth()
使用枚举Month
,应用程序代码通常更清晰。
getMonth()
public Month getMonth()
getMonthValue()
public int getDayOfMonth()
此方法返回月份的int
值int
值。
public boolean isValidYear(int year)
此方法检查此月和日以及输入年份是否形成有效日期。 这只能在二月二十九日返回假。
year
- 验证年份,超出范围值返回false
Year.isValidMonthDay(MonthDay)
public MonthDay withMonth(int month)
MonthDay
的副本。
这将返回指定月份的一个月日。 如果指定月份的日期无效,则日期将被调整到最后一个有效的日期。
此实例是不可变的,不受此方法调用的影响。
month
- 从1月(1月)至12月(12月)返回的月日设定的月份
MonthDay
基于这个月日与请求的月份,不为null
DateTimeException
- 如果月份值无效
public MonthDay with(Month month)
MonthDay
的副本。
这将返回指定月份的一个月日。 如果指定月份的日期无效,则日期将被调整到最后一个有效的日期。
此实例是不可变的,不受此方法调用的影响。
month
- 在返回的月日设置的月份,不为空
MonthDay
基于这个月日与请求的月份,不为null
public MonthDay withDayOfMonth(int dayOfMonth)
MonthDay
的副本,并更改日期。
这将返回具有指定日期的月日。 如果当月的日期无效,则抛出异常。
此实例是不可变的,不受此方法调用的影响。
dayOfMonth
- 返回月日,从1到31的月份
MonthDay
基于这个月日与请求的一天,不为null
DateTimeException
- 如果月日的价值无效,或者月的日期对于该月无效
public <R> R query(TemporalQuery<R> query)
这使用指定的查询策略对象查询本月。 TemporalQuery
对象定义了用于获取结果的逻辑。 阅读查询的文档,以了解该方法的结果。
该方法的结果是通过调用TemporalQuery.queryFrom(TemporalAccessor)
方法在指定的查询上通过this
作为参数获得的。
query
在界面
TemporalAccessor
R
- 结果的类型
query
- 要调用的查询,不为null
DateTimeException
- 如果无法查询(由查询定义)
ArithmeticException
- 如果发生数字溢出(由查询定义)
public Temporal adjustInto(Temporal temporal)
这将返回与月份和日期的输入相同的可观察类型的时间对象,与之相同。
调整相当于使用Temporal.with(TemporalField, long)
两次,通过ChronoField.MONTH_OF_YEAR
和ChronoField.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);
此实例是不可变的,不受此方法调用的影响。
adjustInto
在接口
TemporalAdjuster
temporal
- 要调整的目标对象,不为null
DateTimeException
- 如果不能进行调整
ArithmeticException
- 如果发生数字溢出
public String format(DateTimeFormatter formatter)
这个月的日子将传递给格式化程序来生成一个字符串。
formatter
- 要使用的格式化程序,不为null
DateTimeException
- 打印时是否发生错误
public LocalDate atYear(int year)
LocalDate
。
这将返回一个LocalDate
从本月日和指定的年形成。
如果这一年不是闰年,那么2月29日的一个月的日子将会调整到2月28日。
此实例是不可变的,不受此方法调用的影响。
year
- 从MIN_YEAR到MAX_YEAR的使用年数
DateTimeException
- 如果年度超出有效期限
public int compareTo(MonthDay other)
比较首先是基于月份的价值,然后是当天的价值。 这是“与equals一致”,被定义Comparable
。
compareTo
在界面
Comparable<MonthDay>
other
- 与其他月相比,不为空
public boolean isAfter(MonthDay other)
other
- 与其他月相比,不为空
public boolean isBefore(MonthDay other)
other
- 与之对比的其他月日,不为空
public boolean equals(Object obj)
比较是基于一年内的月日的时间位置。
equals
在
Object
obj
- 要检查的对象,null返回false
Object.hashCode()
, HashMap
public int hashCode()
hashCode
在
Object
Object.equals(java.lang.Object)
,
System.identityHashCode(java.lang.Object)