Class UTCRules
- java.lang.Object
-
- javax.time.UTCRules
-
- Direct Known Subclasses:
SystemUTCRules
public abstract class UTCRules extends java.lang.ObjectRules defining the UTC time-scale, notably when leap seconds occur.This class defines the UTC time-scale including when leap seconds occur. Subclasses obtain the data from a suitable source, such as TZDB or GPS.
The static methods on this class provide access to the system leap second rules. These are used by default.
UTCRules is an abstract class and must be implemented with care to ensure other classes in the framework operate correctly. All implementations must be final, immutable and thread-safe. Subclasses should be Serializable wherever possible.
-
-
Field Summary
Fields Modifier and Type Field Description protected static longNANOS_PER_SECONDConstant for nanos per standard second: 1,000,000,000.protected static intOFFSET_MJD_EPOCHConstant for the offset from MJD day 0 to the Java Epoch of 1970-01-01: 40587.protected static intOFFSET_MJD_TAIConstant for the offset from MJD day 0 to TAI day 0 of 1958-01-01: 36204.protected static longSECS_PER_DAYConstant for number of seconds per standard day: 86,400.
-
Constructor Summary
Constructors Modifier Constructor Description protectedUTCRules()Creates an instance of the rules.
-
Method Summary
All Methods Static Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description protected InstantconvertToInstant(UTCInstant utcInstant)Converts aUTCInstantto anInstant.protected TAIInstantconvertToTAI(UTCInstant utcInstant)Converts aUTCInstantto aTAIInstant.protected UTCInstantconvertToUTC(Instant instant)Converts anInstantto aUTCInstant.protected abstract UTCInstantconvertToUTC(TAIInstant taiInstant)Converts aTAIInstantto aUTCInstant.abstract intgetLeapSecondAdjustment(long mjDay)Gets the leap second adjustment on the specified date.abstract long[]getLeapSecondDates()Gets all known leap second dates.abstract java.lang.StringgetName()The name of these rules.abstract intgetTAIOffset(long mjDay)Gets the offset to TAI on the specified date.static voidregisterSystemLeapSecond(long mjDay, int leapAdjustment)Adds a new leap second to the system default leap second rules.static UTCRulessystem()Gets the system default leap second rules.java.lang.StringtoString()A string representation of these rules.
-
-
-
Field Detail
-
OFFSET_MJD_EPOCH
protected static final int OFFSET_MJD_EPOCH
Constant for the offset from MJD day 0 to the Java Epoch of 1970-01-01: 40587.- See Also:
- Constant Field Values
-
OFFSET_MJD_TAI
protected static final int OFFSET_MJD_TAI
Constant for the offset from MJD day 0 to TAI day 0 of 1958-01-01: 36204.- See Also:
- Constant Field Values
-
SECS_PER_DAY
protected static final long SECS_PER_DAY
Constant for number of seconds per standard day: 86,400.- See Also:
- Constant Field Values
-
NANOS_PER_SECOND
protected static final long NANOS_PER_SECOND
Constant for nanos per standard second: 1,000,000,000.- See Also:
- Constant Field Values
-
-
Method Detail
-
system
public static UTCRules system()
Gets the system default leap second rules.The system default rules are serializable, immutable and thread-safe. They will remain up to date as new leap seconds are added.
- Returns:
- the system rules, never null
-
registerSystemLeapSecond
public static void registerSystemLeapSecond(long mjDay, int leapAdjustment)Adds a new leap second to the system default leap second rules.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 doesn't match, then an exception is thrown.
- Parameters:
mjDay- the modified julian date that the leap second occurs at the end ofleapAdjustment- the leap seconds to add/remove at the end of the day, either -1 or 1- Throws:
java.lang.IllegalArgumentException- if the leap adjustment is invalidjava.lang.IllegalArgumentException- if the day is before or equal the last known leap second day and the definition does not match a previously registered leapjava.util.ConcurrentModificationException- if another thread updates the rules at the same time
-
getName
public abstract java.lang.String getName()
The name of these rules.- Returns:
- the name, never null
-
getLeapSecondAdjustment
public abstract int getLeapSecondAdjustment(long mjDay)
Gets the leap second adjustment on the specified date.The UTC standard restricts the adjustment to a day to
-1or1.Any leap seconds are added to, or removed from, the end of the specified date.
NOTE: If the UTC specification is altered to allow multiple leap seconds at once, then the result of this method would change.
- Parameters:
mjDay- the date as a Modified Julian Day (number of days from the epoch of 1858-11-17)- Returns:
- the number of seconds added, or removed, from the date, either -1 or 1
-
getTAIOffset
public abstract int getTAIOffset(long mjDay)
Gets the offset to TAI on the specified date.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.
- Parameters:
mjDay- the date as a Modified Julian Day (number of days from the epoch of 1858-11-17)- Returns:
- the TAI offset in seconds
-
getLeapSecondDates
public abstract long[] getLeapSecondDates()
Gets all known leap second dates.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.
- Returns:
- an array of leap second dates expressed as Modified Julian Day values, not null
-
convertToTAI
protected TAIInstant convertToTAI(UTCInstant utcInstant)
Converts aUTCInstantto aTAIInstant.This method converts from the UTC to the TAI time-scale using the leap-second rules of the implementation.
The standard implementation uses
getTAIOffset.- Parameters:
utcInstant- the UTC instant to convert, not null- Returns:
- the converted TAI instant, not null
- Throws:
java.lang.ArithmeticException- if the capacity is exceeded
-
convertToUTC
protected abstract UTCInstant convertToUTC(TAIInstant taiInstant)
Converts aTAIInstantto aUTCInstant.This method converts from the TAI to the UTC time-scale using the leap-second rules of the implementation.
- Parameters:
taiInstant- the TAI instant to convert, not null- Returns:
- the converted UTC instant, not null
- Throws:
java.lang.ArithmeticException- if the capacity is exceeded
-
convertToInstant
protected Instant convertToInstant(UTCInstant utcInstant)
Converts aUTCInstantto anInstant.This method converts from the UTC time-scale to one with 86400 seconds 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
USfrom the UTC nanos-of dayU.
LetL = getLeapAdjustment(mjd).
LetB = 86400 + L - 1000.
LetUS = U - L * (U - B) / 1000.
Where the algorithm is applied whileU >= B.- Parameters:
utcInstant- the UTC instant to convert, not null- Returns:
- the converted instant, not null
- Throws:
java.lang.ArithmeticException- if the capacity is exceeded
-
convertToUTC
protected UTCInstant convertToUTC(Instant instant)
Converts anInstantto aUTCInstant.This method converts from an instant with 86400 seconds 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
Ufrom the UTC-SLS nanos-of dayUS.
LetL = getLeapAdjustment(mjd).
LetB = 86400 + L - 1000.
LetU = B + ((US - B) * 1000) / (1000 - L).
Where the algorithm is applied whileUS >= B.
(This algorithm has been tuned for integer arithmetic from the UTC-SLS specification.)- Parameters:
instant- the instant to convert, not null- Returns:
- the converted UTC instant, not null
- Throws:
java.lang.ArithmeticException- if the capacity is exceeded
-
toString
public java.lang.String toString()
A string representation of these rules.- Overrides:
toStringin classjava.lang.Object- Returns:
- the string representation, never null
-
-