MonthDay

A month-day _in the ISO-8601 calendar system, such as {@code --12-03}. !(p) {@code MonthDay} is an immutable date-time object that represents the combination of a month and day-of-month. Any field that can be derived from a month and day, such as quarter-of-year, can be obtained. !(p) This class does not store or represent a year, time or time-zone. For example, the value "December 3rd" can be stored _in a {@code MonthDay}. !(p) Since a {@code MonthDay} does not possess a year, the leap day of February 29th is considered valid. !(p) This class implements {@link TemporalAccessor} rather than {@link Temporal}. This is because it is not possible to define whether February 29th is valid or not without external information, preventing the implementation of plus/minus. Related to this, {@code MonthDay} only provides access to query and set the fields {@code MONTH_OF_YEAR} and {@code DAY_OF_MONTH}. !(p) The ISO-8601 calendar system is the modern civil calendar system used today _in most of the world. It is equivalent to the proleptic Gregorian calendar system, _in which today's rules for leap years are applied for all time. For most applications written today, the ISO-8601 rules are entirely suitable. However, any application that makes use of historical dates, and requires them to be accurate will find the ISO-8601 approach unsuitable.

!(p) This is a <a href="{@docRoot}/java.base/java/lang/doc-files/ValueBased.html">value-based</a> class; use of identity-sensitive operations (including reference equality ({@code ==}), identity hash code, or synchronization) on instances of {@code MonthDay} may have unpredictable results and should be avoided. The {@code equals} method should be used for comparisons.

@implSpec This class is immutable and thread-safe.

@since 1.8

Members

Functions

_with
MonthDay _with(Month month)

Returns a copy of this {@code MonthDay} with the month-of-year altered. !(p) This returns a month-day with the specified month. If the day-of-month is invalid for the specified month, the day will be adjusted to the last valid day-of-month. !(p) This instance is immutable and unaffected by this method call.

adjustInto
Temporal adjustInto(Temporal temporal)

Adjusts the specified temporal object to have this month-day. !(p) This returns a temporal object of the same observable type as the input with the month and day-of-month changed to be the same as this. !(p) The adjustment is equivalent to using {@link Temporal#_with(TemporalField, long)} twice, passing {@link ChronoField#MONTH_OF_YEAR} and {@link ChronoField#DAY_OF_MONTH} as the fields. If the specified temporal object does not use the ISO calendar system then a {@code DateTimeException} is thrown. !(p) In most cases, it is clearer to reverse the calling pattern by using {@link Temporal#_with(TemporalAdjuster)}: !(pre) // these two lines are equivalent, but the second approach is recommended temporal = thisMonthDay.adjustInto(temporal); temporal = temporal._with(thisMonthDay); </pre> !(p) This instance is immutable and unaffected by this method call.

atYear
LocalDate atYear(int year)

Combines this month-day with a year to create a {@code LocalDate}. !(p) This returns a {@code LocalDate} formed from this month-day and the specified year. !(p) A month-day of February 29th will be adjusted to February 28th _in the resulting date if the year is not a leap year. !(p) This instance is immutable and unaffected by this method call.

compareTo
int compareTo(MonthDay other)

Compares this month-day to another month-day. !(p) The comparison is based first on value of the month, then on the value of the day. It is "consistent with equals", as defined by {@link Comparable}.

get
int get(TemporalField field)

Gets the value of the specified field from this month-day as an {@code int}. !(p) This queries this month-day for the value of the specified field. The returned value will always be within the valid range of values for the field. If it is not possible to return the value, because the field is not supported or for some other reason, an exception is thrown. !(p) If the field is a {@link ChronoField} then the query is implemented here. The {@link #isSupported(TemporalField) supported fields} will return valid values based on this month-day. All other {@code ChronoField} instances will throw an {@code UnsupportedTemporalTypeException}. !(p) If the field is not a {@code ChronoField}, then the result of this method is obtained by invoking {@code TemporalField.getFrom(TemporalAccessor)} passing {@code this} as the argument. Whether the value can be obtained, and what the value represents, is determined by the field.

getDayOfMonth
int getDayOfMonth()

Gets the day-of-month field. !(p) This method returns the primitive {@code int} value for the day-of-month.

getLong
long getLong(TemporalField field)

Gets the value of the specified field from this month-day as a {@code long}. !(p) This queries this month-day for the value of the specified field. If it is not possible to return the value, because the field is not supported or for some other reason, an exception is thrown. !(p) If the field is a {@link ChronoField} then the query is implemented here. The {@link #isSupported(TemporalField) supported fields} will return valid values based on this month-day. All other {@code ChronoField} instances will throw an {@code UnsupportedTemporalTypeException}. !(p) If the field is not a {@code ChronoField}, then the result of this method is obtained by invoking {@code TemporalField.getFrom(TemporalAccessor)} passing {@code this} as the argument. Whether the value can be obtained, and what the value represents, is determined by the field.

getMonth
Month getMonth()

Gets the month-of-year field using the {@code Month} enum. !(p) This method returns the enum {@link Month} for the month. This avoids confusion as to what {@code int} values mean. If you need access to the primitive {@code int} value then the enum provides the {@link Month#getValue() int value}.

getMonthValue
int getMonthValue()

Gets the month-of-year field from 1 to 12. !(p) This method returns the month as an {@code int} from 1 to 12. Application code is frequently clearer if the enum {@link Month} is used by calling {@link #getMonth()}.

isAfter
bool isAfter(MonthDay other)

Checks if this month-day is after the specified month-day.

isBefore
bool isBefore(MonthDay other)

Checks if this month-day is before the specified month-day.

isSupported
bool isSupported(TemporalField field)

Checks if the specified field is supported. !(p) This checks if this month-day can be queried for the specified field. If false, then calling the {@link #range(TemporalField) range} and {@link #get(TemporalField) get} methods will throw an exception. !(p) If the field is a {@link ChronoField} then the query is implemented here. The supported fields are: !(ul) !(li){@code MONTH_OF_YEAR} !(li){@code YEAR} </ul> All other {@code ChronoField} instances will return false. !(p) If the field is not a {@code ChronoField}, then the result of this method is obtained by invoking {@code TemporalField.isSupportedBy(TemporalAccessor)} passing {@code this} as the argument. Whether the field is supported is determined by the field.

isValidYear
bool isValidYear(int year)

Checks if the year is valid for this month-day. !(p) This method checks whether this month and day and the input year form a valid date. This can only return false for February 29th.

opCmp
int opCmp(MonthDay other)
Undocumented in source. Be warned that the author may not have intended to support it.
opEquals
bool opEquals(Object obj)

Checks if this month-day is equal to another month-day. !(p) The comparison is based on the time-line position of the month-day within a year.

query
R query(TemporalQuery!(R) query)

Queries this month-day using the specified query. !(p) This queries this month-day using the specified query strategy object. The {@code TemporalQuery} object defines the logic to be used to obtain the result. Read the documentation of the query to understand what the result of this method will be. !(p) The result of this method is obtained by invoking the {@link TemporalQuery#queryFrom(TemporalAccessor)} method on the specified query passing {@code this} as the argument.

range
ValueRange range(TemporalField field)

Gets the range of valid values for the specified field. !(p) The range object expresses the minimum and maximum valid values for a field. This month-day is used to enhance the accuracy of the returned range. If it is not possible to return the range, because the field is not supported or for some other reason, an exception is thrown. !(p) If the field is a {@link ChronoField} then the query is implemented here. The {@link #isSupported(TemporalField) supported fields} will return appropriate range instances. All other {@code ChronoField} instances will throw an {@code UnsupportedTemporalTypeException}. !(p) If the field is not a {@code ChronoField}, then the result of this method is obtained by invoking {@code TemporalField.rangeRefinedBy(TemporalAccessor)} passing {@code this} as the argument. Whether the range can be obtained is determined by the field.

super_query
R super_query(TemporalQuery!(R) query)
Undocumented in source. Be warned that the author may not have intended to support it.
super_range
ValueRange super_range(TemporalField field)
Undocumented in source. Be warned that the author may not have intended to support it.
toHash
size_t toHash()

A hash code for this month-day.

toString
string toString()

Outputs this month-day as a {@code string}, such as {@code --12-03}. !(p) The output will be _in the format {@code --MM-dd}:

withDayOfMonth
MonthDay withDayOfMonth(int dayOfMonth)

Returns a copy of this {@code MonthDay} with the day-of-month altered. !(p) This returns a month-day with the specified day-of-month. If the day-of-month is invalid for the month, an exception is thrown. !(p) This instance is immutable and unaffected by this method call.

withMonth
MonthDay withMonth(int month)

Returns a copy of this {@code MonthDay} with the month-of-year altered. !(p) This returns a month-day with the specified month. If the day-of-month is invalid for the specified month, the day will be adjusted to the last valid day-of-month. !(p) This instance is immutable and unaffected by this method call.

writeExternal
void writeExternal(DataOutput _out)

Defend against malicious streams.

Static functions

from
MonthDay from(TemporalAccessor temporal)

Obtains an instance of {@code MonthDay} from a temporal object. !(p) This obtains a month-day based on the specified temporal. A {@code TemporalAccessor} represents an arbitrary set of date and time information, which this factory converts to an instance of {@code MonthDay}. !(p) The conversion extracts the {@link ChronoField#MONTH_OF_YEAR MONTH_OF_YEAR} and {@link ChronoField#DAY_OF_MONTH DAY_OF_MONTH} fields. The extraction is only permitted if the temporal object has an ISO chronology, or can be converted to a {@code LocalDate}. !(p) This method matches the signature of the functional interface {@link TemporalQuery} allowing it to be used as a query via method reference, {@code MonthDay::from}.

now
MonthDay now()

Obtains the current month-day from the system clock _in the default time-zone. !(p) This will query the {@link Clock#systemDefaultZone() system clock} _in the default time-zone to obtain the current month-day. !(p) Using this method will prevent the ability to use an alternate clock for testing because the clock is hard-coded.

now
MonthDay now(ZoneId zone)

Obtains the current month-day from the system clock _in the specified time-zone. !(p) This will query the {@link Clock#system(ZoneId) system clock} to obtain the current month-day. Specifying the time-zone avoids dependence on the default time-zone. !(p) Using this method will prevent the ability to use an alternate clock for testing because the clock is hard-coded.

now
MonthDay now(Clock clock)

Obtains the current month-day from the specified clock. !(p) This will query the specified clock to obtain the current month-day. Using this method allows the use of an alternate clock for testing. The alternate clock may be introduced using {@link Clock dependency injection}.

of
MonthDay of(Month month, int dayOfMonth)

Obtains an instance of {@code MonthDay}. !(p) The day-of-month must be valid for the month within a leap year. Hence, for February, day 29 is valid. !(p) For example, passing _in April and day 31 will throw an exception, as there can never be April 31st _in any year. By contrast, passing _in February 29th is permitted, as that month-day can sometimes be valid.

of
MonthDay of(int month, int dayOfMonth)

Obtains an instance of {@code MonthDay}. !(p) The day-of-month must be valid for the month within a leap year. Hence, for month 2 (February), day 29 is valid. !(p) For example, passing _in month 4 (April) and day 31 will throw an exception, as there can never be April 31st _in any year. By contrast, passing _in February 29th is permitted, as that month-day can sometimes be valid.

readExternal
MonthDay readExternal(DataInput _in)
Undocumented in source. Be warned that the author may not have intended to support it.

Inherited Members

From TemporalAccessor

isSupported
bool isSupported(TemporalField field)

Checks if the specified field is supported. !(p) This checks if the date-time can be queried for the specified field. If false, then calling the {@link #range(TemporalField) range} and {@link #get(TemporalField) get} methods will throw an exception.

range
ValueRange range(TemporalField field)

Gets the range of valid values for the specified field. !(p) All fields can be expressed as a {@code long} integer. This method returns an object that describes the valid range for that value. The value of this temporal object is used to enhance the accuracy of the returned range. If the date-time cannot return the range, because the field is unsupported or for some other reason, an exception will be thrown. !(p) Note that the result only describes the minimum and maximum valid values and it is important not to read too much into them. For example, there could be values within the range that are invalid for the field.

get
int get(TemporalField field)

Gets the value of the specified field as an {@code int}. !(p) This queries the date-time for the value of the specified field. The returned value will always be within the valid range of values for the field. If the date-time cannot return the value, because the field is unsupported or for some other reason, an exception will be thrown.

getLong
long getLong(TemporalField field)

Gets the value of the specified field as a {@code long}. !(p) This queries the date-time for the value of the specified field. The returned value may be outside the valid range of values for the field. If the date-time cannot return the value, because the field is unsupported or for some other reason, an exception will be thrown.

query
R query(TemporalQuery!(R) query)

Queries this date-time. !(p) This queries this date-time using the specified query strategy object. !(p) Queries are a key tool for extracting information from date-times. They exists to externalize the process of querying, permitting different approaches, as per the strategy design pattern. Examples might be a query that checks if the date is the day before February 29th _in a leap year, or calculates the number of days to your next birthday. !(p) The most common query implementations are method references, such as {@code LocalDate::from} and {@code ZoneId::from}. Additional implementations are provided as static methods on {@link TemporalQuery}.

toString
string toString()
Undocumented in source.

From TemporalAdjuster

adjustInto
Temporal adjustInto(Temporal temporal)

Adjusts the specified temporal object. !(p) This adjusts the specified temporal object using the logic encapsulated _in the implementing class. Examples might be an adjuster that sets the date avoiding weekends, or one that sets the date to the last day of the month. !(p) There are two equivalent ways of using this method. The first is to invoke this method directly. The second is to use {@link Temporal#_with(TemporalAdjuster)}: !(pre) // these two lines are equivalent, but the second approach is recommended temporal = thisAdjuster.adjustInto(temporal); temporal = temporal._with(thisAdjuster); </pre> It is recommended to use the second approach, {@code _with(TemporalAdjuster)}, as it is a lot clearer to read _in code.

Meta