public abstract class UtcRules extends Object
This class defines the UTC time-scale including when leap seconds occur. Subclasses obtain the data from a suitable source, such as a file.
The static methods on this class provide access to the system leap second rules.
These are used by default in UtcInstant
and TaiInstant
.
Using other rules requires manual use of this class.
The system rules can be updated using a LeapSeconds.txt
} file.
You can create your own version of this file and place it in on the classpath
and it will be used. Due to Java 9 module restrictions, the file is located
under META-INF to avoid module encapsulation problems -
META-INF/org/threeten/extra/scale/LeapSeconds.txt
.
Serializable
wherever possible.Modifier | Constructor | Description |
---|---|---|
protected |
UtcRules() |
Creates an instance of the rules.
|
Modifier and Type | Method | Description |
---|---|---|
Instant |
convertToInstant(TaiInstant taiInstant) |
Converts a
TaiInstant to an Instant . |
Instant |
convertToInstant(UtcInstant utcInstant) |
Converts a
UtcInstant to an Instant . |
TaiInstant |
convertToTai(Instant instant) |
Converts an
Instant to a TaiInstant . |
TaiInstant |
convertToTai(UtcInstant utcInstant) |
Converts a
UtcInstant to a TaiInstant . |
UtcInstant |
convertToUtc(Instant instant) |
Converts an
Instant to a UtcInstant . |
abstract UtcInstant |
convertToUtc(TaiInstant taiInstant) |
Converts a
TaiInstant to a UtcInstant . |
abstract int |
getLeapSecondAdjustment(long mjDay) |
Gets the leap second adjustment on the specified date.
|
abstract long[] |
getLeapSecondDates() |
Gets all known leap second dates.
|
abstract String |
getName() |
The name of these rules.
|
abstract int |
getTaiOffset(long mjDay) |
Gets the offset to TAI on the specified date.
|
static void |
registerLeapSecond(long mjDay,
int leapAdjustment) |
Adds a new leap second to the system default leap second rules.
|
static UtcRules |
system() |
Gets the system default leap second rules.
|
String |
toString() |
A string representation of these rules.
|
void |
validateModifiedJulianDay(long mjDay,
long nanoOfDay) |
Validates combination of Modified Julian Day and nanosecond-of-day.
|
public static UtcRules system()
The system default rules are serializable, immutable and thread-safe. They will remain up to date as new leap seconds are added.
public static void registerLeapSecond(long mjDay, int leapAdjustment)
This method registers a new leap second with the system leap second rules. Once registered, there is no way to deregister the leap second.
Calling this method is thread-safe.
Its effects are immediately visible in all threads.
Where possible, only call this method from a single thread to avoid the possibility of
a ConcurrentModificationException
.
If the leap second being added matches a previous definition, then the method returns normally. If the date is before the last registered date and does not match a previous definition, then an exception is thrown.
mjDay
- the Modified Julian Day that the leap second occurs at the end ofleapAdjustment
- the leap seconds to add/remove at the end of the day, either -1 or 1IllegalArgumentException
- if the leap adjustment is invalidIllegalArgumentException
- if the day is before or equal the last known leap second day
and the definition does not match a previously registered leapConcurrentModificationException
- if another thread updates the rules at the same timepublic abstract String getName()
public abstract int getLeapSecondAdjustment(long mjDay)
The UTC standard restricts the adjustment on any day to -1
or 1
.
Any leap seconds are added to, or removed from, the end of the specified date.
If the UTC specification is altered to allow multiple leap seconds at once, then the result of this method would return a number with an absolute value greater than one.
mjDay
- the date as a Modified Julian Day (number of days from the epoch of 1858-11-17)public abstract int getTaiOffset(long mjDay)
The TAI offset starts at 10 in 1972 and varies from then on based on the dates of leap seconds. The offset will apply for the whole of the date.
mjDay
- the date as a Modified Julian Day (number of days from the epoch of 1858-11-17)public abstract long[] getLeapSecondDates()
The dates are returned as Modified Julian Day values. The leap second is added to, or removed from, the end of the specified dates. The dates will be sorted from earliest to latest.
public void validateModifiedJulianDay(long mjDay, long nanoOfDay)
Modified Julian Day is a simple incrementing count of days where day 0 is 1858-11-17. Nanosecond-of-day is a simple count of nanoseconds from the start of the day including any additional leap-second. This method validates the nanosecond-of-day value against the Modified Julian Day.
The nanosecond-of-day value has a valid range from 0
to
86,400,000,000,000 - 1
on most days, and a larger or smaller range
on leap-second days.
mjDay
- the date as a Modified Julian Day (number of days from the epoch of 1858-11-17)nanoOfDay
- the nanoseconds within the day, including leap secondsDateTimeException
- if nanoOfDay is out of rangepublic TaiInstant convertToTai(UtcInstant utcInstant)
UtcInstant
to a TaiInstant
.
This method converts from the UTC to the TAI time-scale using the leap-second rules of the implementation.
utcInstant
- the UTC instant to convert, not nullDateTimeException
- if the valid range is exceededArithmeticException
- if numeric overflow occurspublic abstract UtcInstant convertToUtc(TaiInstant taiInstant)
TaiInstant
to a UtcInstant
.
This method converts from the TAI to the UTC time-scale using the leap-second rules of the implementation.
taiInstant
- the TAI instant to convert, not nullDateTimeException
- if the valid range is exceededArithmeticException
- if numeric overflow occurspublic Instant convertToInstant(UtcInstant utcInstant)
UtcInstant
to an Instant
.
This method converts from the UTC time-scale to one with 86400 subdivisions per day using the leap-second rules of the implementation.
The standard implementation uses the UTC-SLS algorithm. Overriding this algorithm is possible, however doing so will conflict other parts of the specification.
The algorithm calculates the UTC-SLS nanos-of-day US
from the UTC nanos-of day U
.
Let L = getLeapAdjustment(mjd)
.
Let B = 86400 + L - 1000
.
Let US = U - L * (U - B) / 1000
.
Where the algorithm is applied while U >= B
.
utcInstant
- the UTC instant to convert, not nullDateTimeException
- if the valid range is exceededArithmeticException
- if numeric overflow occurspublic UtcInstant convertToUtc(Instant instant)
Instant
to a UtcInstant
.
This method converts from an instant with 86400 subdivisions per day to the UTC time-scale using the leap-second rules of the implementation.
The standard implementation uses the UTC-SLS algorithm. Overriding this algorithm is possible, however doing so will conflict other parts of the specification.
The algorithm calculates the UTC nanos-of-day U
from the UTC-SLS nanos-of day US
.
Let L = getLeapAdjustment(mjd)
.
Let B = 86400 + L - 1000
.
Let U = B + ((US - B) * 1000) / (1000 - L)
.
Where the algorithm is applied while US >= B
.
(This algorithm has been tuned for integer arithmetic from the UTC-SLS specification.)
instant
- the instant to convert, not nullDateTimeException
- if the valid range is exceededArithmeticException
- if numeric overflow occurspublic Instant convertToInstant(TaiInstant taiInstant)
TaiInstant
to an Instant
.
This method converts from the TAI time-scale to one with 86400 subdivisions per day using the leap-second rules of the implementation.
The standard implementation uses UTC-SLS. It uses
convertToUtc(TaiInstant)
and convertToInstant(UtcInstant)
.
taiInstant
- the TAI instant to convert, not nullDateTimeException
- if the valid range is exceededArithmeticException
- if numeric overflow occurspublic TaiInstant convertToTai(Instant instant)
Instant
to a TaiInstant
.
This method converts from an instant with 86400 subdivisions per day to the TAI time-scale using the leap-second rules of the implementation.
The standard implementation uses the UTC-SLS algorithm. It uses
convertToUtc(TaiInstant)
and convertToInstant(UtcInstant)
.
instant
- the instant to convert, not nullDateTimeException
- if the valid range is exceededArithmeticException
- if numeric overflow occursCopyright © 2010–2019 ThreeTen.org. All rights reserved.