Top Description Inners Fields Constructors Methods
java.time.temporal

public final Class IsoFields

extends Object
Class Inheritance
Static Imports
java.time.DayOfWeek.THURSDAY, .DayOfWeek.WEDNESDAY, java.time.temporal.ChronoField.DAY_OF_WEEK, .ChronoField.DAY_OF_YEAR, .ChronoField.EPOCH_DAY, .ChronoField.MONTH_OF_YEAR, .ChronoField.YEAR, .ChronoUnit.DAYS, .ChronoUnit.FOREVER, .ChronoUnit.MONTHS, .ChronoUnit.WEEKS, .ChronoUnit.YEARS

Fields and units specific to the ISO-8601 calendar system, including quarter-of-year and week-based-year.

This class defines fields and units that are specific to the ISO calendar system.

Quarter of year

The ISO-8601 standard is based on the standard civic 12 month year. This is commonly divided into four quarters, often abbreviated as Q1, Q2, Q3 and Q4.

January, February and March are in Q1. April, May and June are in Q2. July, August and September are in Q3. October, November and December are in Q4.

The complete date is expressed using three fields:

Week based years

The ISO-8601 standard was originally intended as a data interchange format, defining a string format for dates and times. However, it also defines an alternate way of expressing the date, based on the concept of week-based-year.

The date is expressed using three fields:

The week-based-year itself is defined relative to the standard ISO proleptic year. It differs from the standard year in that it always starts on a Monday.

The first week of a week-based-year is the first Monday-based week of the standard ISO year that has at least 4 days in the new year.

There are 52 weeks in most week-based years, however on occasion there are 53 weeks.

For example:

Examples of Week based Years
DateDay-of-weekField values
2008-12-28SundayWeek 52 of week-based-year 2008
2008-12-29MondayWeek 1 of week-based-year 2009
2008-12-31WednesdayWeek 1 of week-based-year 2009
2009-01-01ThursdayWeek 1 of week-based-year 2009
2009-01-04SundayWeek 1 of week-based-year 2009
2009-01-05MondayWeek 2 of week-based-year 2009

Implementation Specification

This class is immutable and thread-safe.

Since
1.8

Nested and Inner Type Summary

Modifier and TypeClass and Description
private static enum
IsoFields.Field

Implementation of the field.

private static enum
IsoFields.Unit

Implementation of the unit.

Field Summary

Modifier and TypeField and Description
public static final TemporalField
DAY_OF_QUARTER

The field that represents the day-of-quarter.

public static final TemporalField
QUARTER_OF_YEAR

The field that represents the quarter-of-year.

public static final TemporalUnit
QUARTER_YEARS

Unit that represents the concept of a quarter-year.

public static final TemporalField
WEEK_BASED_YEAR

The field that represents the week-based-year.

public static final TemporalUnit
WEEK_BASED_YEARS

The unit that represents week-based-years for the purpose of addition and subtraction.

public static final TemporalField
WEEK_OF_WEEK_BASED_YEAR

The field that represents the week-of-week-based-year.

Constructor Summary

AccessConstructor and Description
private
IsoFields()

Restricted constructor.

Method Summary

Modifier and TypeMethod and Description
private static void
private static boolean
Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringwaitwaitwait

Field Detail

DAY_OF_QUARTERback to summary
public static final TemporalField DAY_OF_QUARTER

The field that represents the day-of-quarter.

This field allows the day-of-quarter value to be queried and set. The day-of-quarter has values from 1 to 90 in Q1 of a standard year, from 1 to 91 in Q1 of a leap year, from 1 to 91 in Q2 and from 1 to 92 in Q3 and Q4.

The day-of-quarter can only be calculated if the day-of-year, month-of-year and year are available.

When setting this field, the value is allowed to be partially lenient, taking any value from 1 to 92. If the quarter has less than 92 days, then day 92, and potentially day 91, is in the following quarter.

In the resolving phase of parsing, a date can be created from a year, quarter-of-year and day-of-quarter.

In strict mode, all three fields are validated against their range of valid values. The day-of-quarter field is validated from 1 to 90, 91 or 92 depending on the year and quarter.

In smart mode, all three fields are validated against their range of valid values. The day-of-quarter field is validated between 1 and 92, ignoring the actual range based on the year and quarter. If the day-of-quarter exceeds the actual range by one day, then the resulting date is one day later. If the day-of-quarter exceeds the actual range by two days, then the resulting date is two days later.

In lenient mode, only the year is validated against the range of valid values. The resulting date is calculated equivalent to the following three stage approach. First, create a date on the first of January in the requested year. Then take the quarter-of-year, subtract one, and add the amount in quarters to the date. Finally, take the day-of-quarter, subtract one, and add the amount in days to the date.

This unit is an immutable and thread-safe singleton.

QUARTER_OF_YEARback to summary
public static final TemporalField QUARTER_OF_YEAR

The field that represents the quarter-of-year.

This field allows the quarter-of-year value to be queried and set. The quarter-of-year has values from 1 to 4.

The quarter-of-year can only be calculated if the month-of-year is available.

In the resolving phase of parsing, a date can be created from a year, quarter-of-year and day-of-quarter. See DAY_OF_QUARTER for details.

This unit is an immutable and thread-safe singleton.

QUARTER_YEARSback to summary
public static final TemporalUnit QUARTER_YEARS

Unit that represents the concept of a quarter-year. For the ISO calendar system, it is equal to 3 months. The estimated duration of a quarter-year is one quarter of 365.2425 Days.

This unit is an immutable and thread-safe singleton.

WEEK_BASED_YEARback to summary
public static final TemporalField WEEK_BASED_YEAR

The field that represents the week-based-year.

This field allows the week-based-year value to be queried and set.

The field has a range that matches LocalDate#MAX and LocalDate#MIN.

In the resolving phase of parsing, a date can be created from a week-based-year, week-of-week-based-year and day-of-week. See WEEK_OF_WEEK_BASED_YEAR for details.

This unit is an immutable and thread-safe singleton.

WEEK_BASED_YEARSback to summary
public static final TemporalUnit WEEK_BASED_YEARS

The unit that represents week-based-years for the purpose of addition and subtraction.

This allows a number of week-based-years to be added to, or subtracted from, a date. The unit is equal to either 52 or 53 weeks. The estimated duration of a week-based-year is the same as that of a standard ISO year at 365.2425 Days.

The rules for addition add the number of week-based-years to the existing value for the week-based-year field. If the resulting week-based-year only has 52 weeks, then the date will be in week 1 of the following week-based-year.

This unit is an immutable and thread-safe singleton.

WEEK_OF_WEEK_BASED_YEARback to summary
public static final TemporalField WEEK_OF_WEEK_BASED_YEAR

The field that represents the week-of-week-based-year.

This field allows the week of the week-based-year value to be queried and set. The week-of-week-based-year has values from 1 to 52, or 53 if the week-based-year has 53 weeks.

In the resolving phase of parsing, a date can be created from a week-based-year, week-of-week-based-year and day-of-week.

In strict mode, all three fields are validated against their range of valid values. The week-of-week-based-year field is validated from 1 to 52 or 53 depending on the week-based-year.

In smart mode, all three fields are validated against their range of valid values. The week-of-week-based-year field is validated between 1 and 53, ignoring the week-based-year. If the week-of-week-based-year is 53, but the week-based-year only has 52 weeks, then the resulting date is in week 1 of the following week-based-year.

In lenient mode, only the week-based-year is validated against the range of valid values. If the day-of-week is outside the range 1 to 7, then the resulting date is adjusted by a suitable number of weeks to reduce the day-of-week to the range 1 to 7. If the week-of-week-based-year value is outside the range 1 to 52, then any excess weeks are added or subtracted from the resulting date.

This unit is an immutable and thread-safe singleton.

Constructor Detail

IsoFieldsback to summary
private IsoFields()

Restricted constructor.

Method Detail

ensureIsoback to summary
private static void ensureIso(TemporalAccessor temporal)
isIsoback to summary
private static boolean isIso(TemporalAccessor temporal)
java.time.temporal back to summary

private sealed Enum IsoFields.Field

extends Enum<IsoFields.Field>
implements TemporalField
Class Inheritance
All Implemented Interfaces
java.time.temporal.TemporalField

Implementation of the field.

Field Summary

Modifier and TypeField and Description
public static final IsoFields.Field
private static final int[]
public static final IsoFields.Field
public static final IsoFields.Field
public static final IsoFields.Field

Constructor Summary

AccessConstructor and Description
private

Method Summary

Modifier and TypeMethod and Description
private static int
private static int
private static ValueRange
private static int
getWeekRange(int wby)

public boolean
isDateBased()

Implements java.time.temporal.TemporalField.isDateBased.

Checks if this field represents a component of a date.

public boolean
isTimeBased()

Implements java.time.temporal.TemporalField.isTimeBased.

Checks if this field represents a component of a time.

public ValueRange
rangeRefinedBy(TemporalAccessor
the temporal object used to refine the result, not null
temporal
)

Implements java.time.temporal.TemporalField.rangeRefinedBy.

Get the range of valid values for this field using the temporal object to refine the result.

public static IsoFields.Field
public static IsoFields.Field[]
Inherited from java.lang.Enum:
clonecompareTodescribeConstableequalsfinalizegetDeclaringClasshashCodenameordinaltoStringvalueOf

Field Detail

DAY_OF_QUARTERback to summary
public static final IsoFields.Field DAY_OF_QUARTER
QUARTER_DAYSback to summary
private static final int[] QUARTER_DAYS
QUARTER_OF_YEARback to summary
public static final IsoFields.Field QUARTER_OF_YEAR
WEEK_BASED_YEARback to summary
public static final IsoFields.Field WEEK_BASED_YEAR
WEEK_OF_WEEK_BASED_YEARback to summary
public static final IsoFields.Field WEEK_OF_WEEK_BASED_YEAR

Constructor Detail

Fieldback to summary
private Field()

Method Detail

getWeekback to summary
private static int getWeek(LocalDate date)
getWeekBasedYearback to summary
private static int getWeekBasedYear(LocalDate date)
getWeekRangeback to summary
private static ValueRange getWeekRange(LocalDate date)
getWeekRangeback to summary
private static int getWeekRange(int wby)
isDateBasedback to summary
public boolean isDateBased()

Implements java.time.temporal.TemporalField.isDateBased.

Doc from java.time.temporal.TemporalField.isDateBased.

Checks if this field represents a component of a date.

A field is date-based if it can be derived from EPOCH_DAY. Note that it is valid for both isDateBased() and isTimeBased() to return false, such as when representing a field like minute-of-week.

Returns:boolean

true if this field is a component of a date

Annotations
@Override
isTimeBasedback to summary
public boolean isTimeBased()

Implements java.time.temporal.TemporalField.isTimeBased.

Doc from java.time.temporal.TemporalField.isTimeBased.

Checks if this field represents a component of a time.

A field is time-based if it can be derived from NANO_OF_DAY. Note that it is valid for both isDateBased() and isTimeBased() to return false, such as when representing a field like minute-of-week.

Returns:boolean

true if this field is a component of a time

Annotations
@Override
rangeRefinedByback to summary
public ValueRange rangeRefinedBy(TemporalAccessor temporal)

Implements java.time.temporal.TemporalField.rangeRefinedBy.

Doc from java.time.temporal.TemporalField.rangeRefinedBy.

Get the range of valid values for this field using the temporal object to refine the result.

This uses the temporal object to find the range of valid values for the field. This is similar to range(), however this method refines the result using the temporal. For example, if the field is DAY_OF_MONTH the range method is not accurate as there are four possible month lengths, 28, 29, 30 and 31 days. Using this method with a date allows the range to be accurate, returning just one of those four options.

There are two equivalent ways of using this method. The first is to invoke this method directly. The second is to use TemporalAccessor#range(TemporalField):

  // these two lines are equivalent, but the second approach is recommended
  temporal = thisField.rangeRefinedBy(temporal);
  temporal = temporal.range(thisField);
It is recommended to use the second approach, range(TemporalField), as it is a lot clearer to read in code.

Implementations should perform any queries or calculations using the fields available in ChronoField. If the field is not supported an UnsupportedTemporalTypeException must be thrown.

Parameters
temporal:TemporalAccessor

the temporal object used to refine the result, not null

Returns:ValueRange

the range of valid values for this field, not null

Annotations
@Override
valueOfback to summary
public static IsoFields.Field valueOf(String name)
valuesback to summary
public static IsoFields.Field[] values()
java.time.temporal back to summary

private final Enum IsoFields.Unit

extends Enum<IsoFields.Unit>
implements TemporalUnit
Class Inheritance
All Implemented Interfaces
java.time.temporal.TemporalUnit

Implementation of the unit.

Field Summary

Modifier and TypeField and Description
private final Duration
private final String
public static final IsoFields.Unit
QUARTER_YEARS

Unit that represents the concept of a quarter-year.

public static final IsoFields.Unit
WEEK_BASED_YEARS

Unit that represents the concept of a week-based-year.

Constructor Summary

AccessConstructor and Description
private
Unit(String name, Duration estimatedDuration)

Method Summary

Modifier and TypeMethod and Description
public <R extends Temporal> R
addTo(R
the temporal object to adjust, not null
temporal
,
long
the amount of this unit to add, positive or negative
amount
)

Implements java.time.temporal.TemporalUnit.addTo.

Returns a copy of the specified temporal object with the specified period added.

public long
between(Temporal
the base temporal object, not null
temporal1Inclusive
,
Temporal
the other temporal object, exclusive, not null
temporal2Exclusive
)

Implements java.time.temporal.TemporalUnit.between.

Calculates the amount of time between two temporal objects.

public Duration
getDuration()

Implements java.time.temporal.TemporalUnit.getDuration.

Gets the duration of this unit, which may be an estimate.

public boolean
isDateBased()

Implements java.time.temporal.TemporalUnit.isDateBased.

Checks if this unit represents a component of a date.

public boolean
isDurationEstimated()

Implements java.time.temporal.TemporalUnit.isDurationEstimated.

Checks if the duration of the unit is an estimate.

public boolean
isSupportedBy(Temporal
the temporal object to check, not null
temporal
)

Overrides default java.time.temporal.TemporalUnit.isSupportedBy.

Checks if this unit is supported by the specified temporal object.

public boolean
isTimeBased()

Implements java.time.temporal.TemporalUnit.isTimeBased.

Checks if this unit represents a component of a time.

public String
toString()

Overrides java.lang.Enum.toString.

Implements java.time.temporal.TemporalUnit.toString.

Gets a descriptive name for the unit.

public static IsoFields.Unit
public static IsoFields.Unit[]
Inherited from java.lang.Enum:
clonecompareTodescribeConstableequalsfinalizegetDeclaringClasshashCodenameordinalvalueOf

Field Detail

durationback to summary
private final Duration duration
nameback to summary
private final String name

Hides java.lang.Enum.name.

QUARTER_YEARSback to summary
public static final IsoFields.Unit QUARTER_YEARS

Unit that represents the concept of a quarter-year.

WEEK_BASED_YEARSback to summary
public static final IsoFields.Unit WEEK_BASED_YEARS

Unit that represents the concept of a week-based-year.

Constructor Detail

Unitback to summary
private Unit(String name, Duration estimatedDuration)

Method Detail

addToback to summary
public <R extends Temporal> R addTo(R temporal, long amount)

Implements java.time.temporal.TemporalUnit.addTo.

Doc from java.time.temporal.TemporalUnit.addTo.

Returns a copy of the specified temporal object with the specified period added.

The period added is a multiple of this unit. For example, this method could be used to add "3 days" to a date by calling this method on the instance representing "days", passing the date and the period "3". The period to be added may be negative, which is equivalent to subtraction.

There are two equivalent ways of using this method. The first is to invoke this method directly. The second is to use Temporal#plus(long, TemporalUnit):

  // these two lines are equivalent, but the second approach is recommended
  temporal = thisUnit.addTo(temporal);
  temporal = temporal.plus(thisUnit);
It is recommended to use the second approach, plus(TemporalUnit), as it is a lot clearer to read in code.

Implementations should perform any queries or calculations using the units available in ChronoUnit or the fields available in ChronoField. If the unit is not supported an UnsupportedTemporalTypeException must be thrown.

Implementations must not alter the specified temporal object. Instead, an adjusted copy of the original must be returned. This provides equivalent, safe behavior for immutable and mutable implementations.

Parameters
<R>
the type of the Temporal object
temporal:R

the temporal object to adjust, not null

amount:long

the amount of this unit to add, positive or negative

Returns:R

the adjusted temporal object, not null

Annotations
@SuppressWarnings:unchecked
@Override
betweenback to summary
public long between(Temporal temporal1Inclusive, Temporal temporal2Exclusive)

Implements java.time.temporal.TemporalUnit.between.

Doc from java.time.temporal.TemporalUnit.between.

Calculates the amount of time between two temporal objects.

This calculates the amount in terms of this unit. The start and end points are supplied as temporal objects and must be of compatible types. The implementation will convert the second type to be an instance of the first type before the calculating the amount. The result will be negative if the end is before the start. For example, the amount in hours between two temporal objects can be calculated using HOURS.between(startTime, endTime).

The calculation returns a whole number, representing the number of complete units between the two temporals. For example, the amount in hours between the times 11:30 and 13:29 will only be one hour as it is one minute short of two hours.

There are two equivalent ways of using this method. The first is to invoke this method directly. The second is to use Temporal#until(Temporal, TemporalUnit):

  // these two lines are equivalent
  between = thisUnit.between(start, end);
  between = start.until(end, thisUnit);
The choice should be made based on which makes the code more readable.

For example, this method allows the number of days between two dates to be calculated:

 long daysBetween = DAYS.between(start, end);
 // or alternatively
 long daysBetween = start.until(end, DAYS);

Implementations should perform any queries or calculations using the units available in ChronoUnit or the fields available in ChronoField. If the unit is not supported an UnsupportedTemporalTypeException must be thrown. Implementations must not alter the specified temporal objects.

Parameters
temporal1Inclusive:Temporal

the base temporal object, not null

temporal2Exclusive:Temporal

the other temporal object, exclusive, not null

Returns:long

the amount of time between temporal1Inclusive and temporal2Exclusive in terms of this unit; positive if temporal2Exclusive is later than temporal1Inclusive, negative if earlier

Annotations
@Override
getDurationback to summary
public Duration getDuration()

Implements java.time.temporal.TemporalUnit.getDuration.

Doc from java.time.temporal.TemporalUnit.getDuration.

Gets the duration of this unit, which may be an estimate.

All units return a duration measured in standard nanoseconds from this method. The duration will be positive and non-zero. For example, an hour has a duration of 60 * 60 * 1,000,000,000ns.

Some units may return an accurate duration while others return an estimate. For example, days have an estimated duration due to the possibility of daylight saving time changes. To determine if the duration is an estimate, use isDurationEstimated().

Returns:Duration

the duration of this unit, which may be an estimate, not null

Annotations
@Override
isDateBasedback to summary
public boolean isDateBased()

Implements java.time.temporal.TemporalUnit.isDateBased.

Doc from java.time.temporal.TemporalUnit.isDateBased.

Checks if this unit represents a component of a date.

A date is time-based if it can be used to imply meaning from a date. It must have a duration that is an integral multiple of the length of a standard day. Note that it is valid for both isDateBased() and isTimeBased() to return false, such as when representing a unit like 36 hours.

Returns:boolean

true if this unit is a component of a date

Annotations
@Override
isDurationEstimatedback to summary
public boolean isDurationEstimated()

Implements java.time.temporal.TemporalUnit.isDurationEstimated.

Doc from java.time.temporal.TemporalUnit.isDurationEstimated.

Checks if the duration of the unit is an estimate.

All units have a duration, however the duration is not always accurate. For example, days have an estimated duration due to the possibility of daylight saving time changes. This method returns true if the duration is an estimate and false if it is accurate. Note that accurate/estimated ignores leap seconds.

Returns:boolean

true if the duration is estimated, false if accurate

Annotations
@Override
isSupportedByback to summary
public boolean isSupportedBy(Temporal temporal)

Overrides default java.time.temporal.TemporalUnit.isSupportedBy.

Doc from java.time.temporal.TemporalUnit.isSupportedBy.

Checks if this unit is supported by the specified temporal object.

This checks that the implementing date-time can add/subtract this unit. This can be used to avoid throwing an exception.

This default implementation derives the value using Temporal#plus(long, TemporalUnit).

Parameters
temporal:Temporal

the temporal object to check, not null

Returns:boolean

true if the unit is supported

Annotations
@Override
isTimeBasedback to summary
public boolean isTimeBased()

Implements java.time.temporal.TemporalUnit.isTimeBased.

Doc from java.time.temporal.TemporalUnit.isTimeBased.

Checks if this unit represents a component of a time.

A unit is time-based if it can be used to imply meaning from a time. It must have a duration that divides into the length of a standard day without remainder. Note that it is valid for both isDateBased() and isTimeBased() to return false, such as when representing a unit like 36 hours.

Returns:boolean

true if this unit is a component of a time

Annotations
@Override
toStringback to summary
public String toString()

Overrides java.lang.Enum.toString.

Implements java.time.temporal.TemporalUnit.toString.

Doc from java.time.temporal.TemporalUnit.toString.

Gets a descriptive name for the unit.

This should be in the plural and upper-first camel case, such as 'Days' or 'Minutes'.

Returns:String

the name of this unit, not null

Annotations
@Override
valueOfback to summary
public static IsoFields.Unit valueOf(String name)
valuesback to summary
public static IsoFields.Unit[] values()