Top Description Fields Constructors Methods
org.threeten.extra.chrono

public final Class DiscordianChronology

extends AbstractChronology
implements Serializable
Class Inheritance
All Implemented Interfaces
java.io.Serializable
Imports
java.io.Serializable, java.time.Clock, .DateTimeException, .Instant, .ZoneId, java.time.chrono.AbstractChronology, .ChronoLocalDateTime, .ChronoZonedDateTime, .Chronology, .Era, java.time.format.ResolverStyle, java.time.temporal.ChronoField, .TemporalAccessor, .TemporalField, .ValueRange, java.util.Arrays, .List, .Map

The Discordian calendar system.

This chronology defines the rules of the proleptic Discordian calendar system. The Discordian differs from the Gregorian in terms of month and week lengths, with an offset year. Dates are aligned such that each Discordian year starts with each ISO year, with an offset index.

This class is not proleptic. It implements Discordian rules only since YOLD 1 (ISO BCE 1166).

The fields are defined as follows:

Implementation Requirements

This class is immutable and thread-safe.

Field Summary

Modifier and TypeField and Description
private static final ValueRange
ALIGNED_DOW_OF_YEAR_RANGE

Range of aligned day-of-week of year.

pack-priv static final ValueRange
DAY_OF_MONTH_RANGE

Range of day-of-month.

private static final ValueRange
DAY_OF_WEEK_RANGE

Range of day-of-week.

pack-priv static final int
DAYS_IN_MONTH

Days in a regular month.

pack-priv static final int
DAYS_IN_WEEK

Days in a regular week.

pack-priv static final ValueRange
EPOCH_DAY_RANGE

Range of epoch day.

private static final ValueRange
ERA_RANGE

Range of eras.

public static final DiscordianChronology
INSTANCE

Singleton instance for the Discordian chronology.

pack-priv static final ValueRange
MONTH_OF_YEAR_RANGE

Range of month-of-year.

pack-priv static final int
MONTHS_IN_YEAR

Months in a regular year.

pack-priv static final int
OFFSET_FROM_ISO_0000

Offset from ISO 0

private static final ValueRange
PROLEPTIC_MONTH_RANGE

Range of proleptic month.

private static final long
serialVersionUID

Serialization version.

private static final ValueRange
WEEK_OF_MONTH_RANGE

Range of week-of-month.

private static final ValueRange
WEEK_OF_YEAR_RANGE

Range of week-of-year.

pack-priv static final int
WEEKS_IN_YEAR

Weeks in a regular year.

pack-priv static final ValueRange
YEAR_RANGE

Range of proleptic-year.

Constructor Summary

AccessConstructor and Description
public
DiscordianChronology()
Deprecated Use the singleton INSTANCE instead.

Private constructor, that is public to satisfy the ServiceLoader.

Method Summary

Modifier and TypeMethod and Description
public DiscordianDate

Returns:

the Discordian local date, not null
date
(Era
the Discordian era, not null
era
,
int
the year-of-era
yearOfEra
,
int
the month-of-year
month
,
int
the day-of-month
dayOfMonth
)

Overrides default java.time.chrono.Chronology.date.

Obtains a local date in Discordian calendar system from the era, year-of-era, month-of-year and day-of-month fields.

public DiscordianDate

Returns:

the Discordian local date, not null
date
(int
the proleptic-year
prolepticYear
,
int
the month-of-year
month
,
int
the day-of-month
dayOfMonth
)

Implements java.time.chrono.Chronology.date.

Obtains a local date in Discordian calendar system from the proleptic-year, month-of-year and day-of-month fields.

public DiscordianDate

Returns:

the Discordian local date, not null
date
(TemporalAccessor
the date-time object to convert, not null
temporal
)

Implements java.time.chrono.Chronology.date.

Obtains a Discordian local date from another date-time object.

public DiscordianDate

Returns:

the Discordian local date, not null
dateEpochDay
(long
the epoch day
epochDay
)

Implements java.time.chrono.Chronology.dateEpochDay.

Obtains a local date in the Discordian calendar system from the epoch-day.

public DiscordianDate

Returns:

the current Discordian local date using the system clock and default time-zone, not null
dateNow
()

Overrides default java.time.chrono.Chronology.dateNow.

Obtains the current Discordian local date from the system clock in the default time-zone.

public DiscordianDate

Returns:

the current Discordian local date using the system clock, not null
dateNow
(ZoneId
the zone ID to use, not null
zone
)

Overrides default java.time.chrono.Chronology.dateNow.

Obtains the current Discordian local date from the system clock in the specified time-zone.

public DiscordianDate

Returns:

the current Discordian local date, not null
dateNow
(Clock
the clock to use, not null
clock
)

Overrides default java.time.chrono.Chronology.dateNow.

Obtains the current Discordian local date from the specified clock.

public DiscordianDate

Returns:

the Discordian local date, not null
dateYearDay
(Era
the Discordian era, not null
era
,
int
the year-of-era
yearOfEra
,
int
the day-of-year
dayOfYear
)

Overrides default java.time.chrono.Chronology.dateYearDay.

Obtains a local date in Discordian calendar system from the era, year-of-era and day-of-year fields.

public DiscordianDate

Returns:

the Discordian local date, not null
dateYearDay
(int
the proleptic-year
prolepticYear
,
int
the day-of-year
dayOfYear
)

Implements java.time.chrono.Chronology.dateYearDay.

Obtains a local date in the Discordian calendar system from the proleptic-year and day-of-year fields.

public DiscordianEra
eraOf(int
the era value
era
)

Implements java.time.chrono.Chronology.eraOf.

Creates the chronology era object from the numeric value.

public List<Era>
eras()

Implements java.time.chrono.Chronology.eras.

Gets the list of eras for the chronology.

public String

Returns:

the calendar system type - 'discordian'
getCalendarType
()

Implements java.time.chrono.Chronology.getCalendarType.

Gets the calendar type of the underlying calendar system - 'discordian'.

public String

Returns:

the chronology ID - 'Discordian'
getId
()

Implements java.time.chrono.Chronology.getId.

Gets the ID of the chronology - 'Discordian'.

public boolean

Returns:

true if the year is a leap year
isLeapYear
(long
the proleptic-year to check, not validated for range
prolepticYear
)

Implements java.time.chrono.Chronology.isLeapYear.

Checks if the specified year is a leap year.

public ChronoLocalDateTime<DiscordianDate>

Returns:

the Discordian local date-time, not null
localDateTime
(TemporalAccessor
the date-time object to convert, not null
temporal
)

Overrides default java.time.chrono.Chronology.localDateTime.

Obtains a Discordian local date-time from another date-time object.

public int
prolepticYear(Era
the era of the correct type for the chronology, not null
era
,
int
the chronology year-of-era
yearOfEra
)

Implements java.time.chrono.Chronology.prolepticYear.

Calculates the proleptic-year given the era and year-of-era.

public ValueRange
range(ChronoField
the field to get the range for, not null
field
)

Implements java.time.chrono.Chronology.range.

Gets the range of valid values for the specified field.

private Object

Returns:

the singleton instance, not null
readResolve
()

Resolve singleton.

public DiscordianDate
resolveDate(Map<TemporalField, Long>
the map of fields to values, which can be updated, not null
fieldValues
,
ResolverStyle
the requested type of resolve, not null
resolverStyle
)

Overrides java.time.chrono.AbstractChronology.resolveDate.

Implements java.time.chrono.Chronology.resolveDate.

Resolves parsed ChronoField values into a date during parsing.

public ChronoZonedDateTime<DiscordianDate>

Returns:

the Discordian zoned date-time, not null
zonedDateTime
(TemporalAccessor
the date-time object to convert, not null
temporal
)

Overrides default java.time.chrono.Chronology.zonedDateTime.

Obtains a Discordian zoned date-time from another date-time object.

public ChronoZonedDateTime<DiscordianDate>

Returns:

the Discordian zoned date-time, not null
zonedDateTime
(Instant
the instant to create the date-time from, not null
instant
,
ZoneId
the time-zone, not null
zone
)

Overrides default java.time.chrono.Chronology.zonedDateTime.

Obtains a Discordian zoned date-time in this chronology from an Instant.

Inherited from java.time.chrono.AbstractChronology:
compareToequalshashCodetoString

Field Detail

ALIGNED_DOW_OF_YEAR_RANGEback to summary
private static final ValueRange ALIGNED_DOW_OF_YEAR_RANGE

Range of aligned day-of-week of year.

DAY_OF_MONTH_RANGEback to summary
pack-priv static final ValueRange DAY_OF_MONTH_RANGE

Range of day-of-month.

DAY_OF_WEEK_RANGEback to summary
private static final ValueRange DAY_OF_WEEK_RANGE

Range of day-of-week.

DAYS_IN_MONTHback to summary
pack-priv static final int DAYS_IN_MONTH

Days in a regular month.

DAYS_IN_WEEKback to summary
pack-priv static final int DAYS_IN_WEEK

Days in a regular week.

EPOCH_DAY_RANGEback to summary
pack-priv static final ValueRange EPOCH_DAY_RANGE

Range of epoch day.

ERA_RANGEback to summary
private static final ValueRange ERA_RANGE

Range of eras.

INSTANCEback to summary
public static final DiscordianChronology INSTANCE

Singleton instance for the Discordian chronology.

MONTH_OF_YEAR_RANGEback to summary
pack-priv static final ValueRange MONTH_OF_YEAR_RANGE

Range of month-of-year.

MONTHS_IN_YEARback to summary
pack-priv static final int MONTHS_IN_YEAR

Months in a regular year.

OFFSET_FROM_ISO_0000back to summary
pack-priv static final int OFFSET_FROM_ISO_0000

Offset from ISO 0

PROLEPTIC_MONTH_RANGEback to summary
private static final ValueRange PROLEPTIC_MONTH_RANGE

Range of proleptic month.

serialVersionUIDback to summary
private static final long serialVersionUID

Serialization version.

WEEK_OF_MONTH_RANGEback to summary
private static final ValueRange WEEK_OF_MONTH_RANGE

Range of week-of-month.

WEEK_OF_YEAR_RANGEback to summary
private static final ValueRange WEEK_OF_YEAR_RANGE

Range of week-of-year.

WEEKS_IN_YEARback to summary
pack-priv static final int WEEKS_IN_YEAR

Weeks in a regular year.

YEAR_RANGEback to summary
pack-priv static final ValueRange YEAR_RANGE

Range of proleptic-year.

Constructor Detail

DiscordianChronologyback to summary
public DiscordianChronology()

Deprecated

Use the singleton INSTANCE instead.

Private constructor, that is public to satisfy the ServiceLoader.

Annotations
@Deprecated

Method Detail

dateback to summary
public DiscordianDate date(Era era, int yearOfEra, int month, int dayOfMonth)

Overrides default java.time.chrono.Chronology.date.

Obtains a local date in Discordian calendar system from the era, year-of-era, month-of-year and day-of-month fields.

Parameters
era:Era

the Discordian era, not null

yearOfEra:int

the year-of-era

month:int

the month-of-year

dayOfMonth:int

the day-of-month

Returns:DiscordianDate

the Discordian local date, not null

Annotations
@Override
Exceptions
DateTimeException:
if unable to create the date
ClassCastException:
if the era is not a DiscordianEra
dateback to summary
public DiscordianDate date(int prolepticYear, int month, int dayOfMonth)

Implements java.time.chrono.Chronology.date.

Obtains a local date in Discordian calendar system from the proleptic-year, month-of-year and day-of-month fields.

Parameters
prolepticYear:int

the proleptic-year

month:int

the month-of-year

dayOfMonth:int

the day-of-month

Returns:DiscordianDate

the Discordian local date, not null

Annotations
@Override
Exceptions
DateTimeException:
if unable to create the date
dateback to summary
public DiscordianDate date(TemporalAccessor temporal)

Implements java.time.chrono.Chronology.date.

Obtains a Discordian local date from another date-time object.

Parameters
temporal:TemporalAccessor

the date-time object to convert, not null

Returns:DiscordianDate

the Discordian local date, not null

Annotations
@Override
Exceptions
DateTimeException:
if unable to create the date
dateEpochDayback to summary
public DiscordianDate dateEpochDay(long epochDay)

Implements java.time.chrono.Chronology.dateEpochDay.

Obtains a local date in the Discordian calendar system from the epoch-day.

Parameters
epochDay:long

the epoch day

Returns:DiscordianDate

the Discordian local date, not null

Annotations
@Override
Exceptions
DateTimeException:
if unable to create the date
dateNowback to summary
public DiscordianDate dateNow()

Overrides default java.time.chrono.Chronology.dateNow.

Obtains the current Discordian local date from the system clock in the default time-zone.

This will query the system clock in the default time-zone to obtain the current date.

Using this method will prevent the ability to use an alternate clock for testing because the clock is hard-coded.

Returns:DiscordianDate

the current Discordian local date using the system clock and default time-zone, not null

Annotations
@Override
Exceptions
DateTimeException:
if unable to create the date
dateNowback to summary
public DiscordianDate dateNow(ZoneId zone)

Overrides default java.time.chrono.Chronology.dateNow.

Obtains the current Discordian local date from the system clock in the specified time-zone.

This will query the system clock to obtain the current date. Specifying the time-zone avoids dependence on the default time-zone.

Using this method will prevent the ability to use an alternate clock for testing because the clock is hard-coded.

Parameters
zone:ZoneId

the zone ID to use, not null

Returns:DiscordianDate

the current Discordian local date using the system clock, not null

Annotations
@Override
Exceptions
DateTimeException:
if unable to create the date
dateNowback to summary
public DiscordianDate dateNow(Clock clock)

Overrides default java.time.chrono.Chronology.dateNow.

Obtains the current Discordian local date from the specified clock.

This will query the specified clock to obtain the current date - today. Using this method allows the use of an alternate clock for testing. The alternate clock may be introduced using dependency injection.

Parameters
clock:Clock

the clock to use, not null

Returns:DiscordianDate

the current Discordian local date, not null

Annotations
@Override
Exceptions
DateTimeException:
if unable to create the date
dateYearDayback to summary
public DiscordianDate dateYearDay(Era era, int yearOfEra, int dayOfYear)

Overrides default java.time.chrono.Chronology.dateYearDay.

Obtains a local date in Discordian calendar system from the era, year-of-era and day-of-year fields.

Parameters
era:Era

the Discordian era, not null

yearOfEra:int

the year-of-era

dayOfYear:int

the day-of-year

Returns:DiscordianDate

the Discordian local date, not null

Annotations
@Override
Exceptions
DateTimeException:
if unable to create the date
ClassCastException:
if the era is not a DiscordianEra
dateYearDayback to summary
public DiscordianDate dateYearDay(int prolepticYear, int dayOfYear)

Implements java.time.chrono.Chronology.dateYearDay.

Obtains a local date in the Discordian calendar system from the proleptic-year and day-of-year fields.

Parameters
prolepticYear:int

the proleptic-year

dayOfYear:int

the day-of-year

Returns:DiscordianDate

the Discordian local date, not null

Annotations
@Override
Exceptions
DateTimeException:
if unable to create the date
eraOfback to summary
public DiscordianEra eraOf(int era)

Implements java.time.chrono.Chronology.eraOf.

Doc from java.time.chrono.Chronology.eraOf.

Creates the chronology era object from the numeric value.

The era is, conceptually, the largest division of the time-line. Most calendar systems have a single epoch dividing the time-line into two eras. However, some have multiple eras, such as one for the reign of each leader. The exact meaning is determined by the chronology according to the following constraints.

The era in use at 1970-01-01 must have the value 1. Later eras must have sequentially higher values. Earlier eras must have sequentially lower values. Each chronology must refer to an enum or similar singleton to provide the era values.

This method returns the singleton era of the correct type for the specified era value.

Parameters
era:int

the era value

Returns:DiscordianEra

the calendar system era, not null

Annotations
@Override
erasback to summary
public List<Era> eras()

Implements java.time.chrono.Chronology.eras.

Doc from java.time.chrono.Chronology.eras.

Gets the list of eras for the chronology.

Most calendar systems have an era, within which the year has meaning. If the calendar system does not support the concept of eras, an empty list must be returned.

Returns:List<Era>

the list of eras for the chronology, may be immutable, not null

Annotations
@Override
getCalendarTypeback to summary
public String getCalendarType()

Implements java.time.chrono.Chronology.getCalendarType.

Gets the calendar type of the underlying calendar system - 'discordian'.

The Unicode Locale Data Markup Language (LDML) specification does not define an identifier for the Discordian calendar, but were it to do so, 'discordian' is highly likely to be chosen.

Returns:String

the calendar system type - 'discordian'

Annotations
@Override
See Also
getId()
getIdback to summary
public String getId()

Implements java.time.chrono.Chronology.getId.

Gets the ID of the chronology - 'Discordian'.

The ID uniquely identifies the Chronology. It can be used to lookup the Chronology using Chronology#of(String).

Returns:String

the chronology ID - 'Discordian'

Annotations
@Override
See Also
getCalendarType()
isLeapYearback to summary
public boolean isLeapYear(long prolepticYear)

Implements java.time.chrono.Chronology.isLeapYear.

Checks if the specified year is a leap year.

A Discordian proleptic-year is leap if the remainder after division by four equals zero. There are two special cases. If the year minus 1166 is divisible by 100 it is not a leap year, unless it is also divisible by 400, when it is a leap year. These rules produce leap days on the same dates as the ISO-8601 calendar system.

Parameters
prolepticYear:long

the proleptic-year to check, not validated for range

Returns:boolean

true if the year is a leap year

Annotations
@Override
localDateTimeback to summary
public ChronoLocalDateTime<DiscordianDate> localDateTime(TemporalAccessor temporal)

Overrides default java.time.chrono.Chronology.localDateTime.

Obtains a Discordian local date-time from another date-time object.

Parameters
temporal:TemporalAccessor

the date-time object to convert, not null

Returns:ChronoLocalDateTime<DiscordianDate>

the Discordian local date-time, not null

Annotations
@Override
@SuppressWarnings:unchecked
Exceptions
DateTimeException:
if unable to create the date-time
prolepticYearback to summary
public int prolepticYear(Era era, int yearOfEra)

Implements java.time.chrono.Chronology.prolepticYear.

Doc from java.time.chrono.Chronology.prolepticYear.

Calculates the proleptic-year given the era and year-of-era.

This combines the era and year-of-era into the single proleptic-year field.

If the chronology makes active use of eras, such as JapaneseChronology then the year-of-era will be validated against the era. For other chronologies, validation is optional.

Parameters
era:Era

the era of the correct type for the chronology, not null

yearOfEra:int

the chronology year-of-era

Returns:int

the proleptic-year

Annotations
@Override
rangeback to summary
public ValueRange range(ChronoField field)

Implements java.time.chrono.Chronology.range.

Doc from java.time.chrono.Chronology.range.

Gets the range of valid values for the specified field.

All fields can be expressed as a long integer. This method returns an object that describes the valid range for that value.

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.

This method will return a result whether or not the chronology supports the field.

Parameters
field:ChronoField

the field to get the range for, not null

Returns:ValueRange

the range of valid values for the field, not null

Annotations
@Override
readResolveback to summary
private Object readResolve()

Resolve singleton.

Returns:Object

the singleton instance, not null

resolveDateback to summary
public DiscordianDate resolveDate(Map<TemporalField, Long> fieldValues, ResolverStyle resolverStyle)

Overrides java.time.chrono.AbstractChronology.resolveDate.

Implements java.time.chrono.Chronology.resolveDate.

Doc from java.time.chrono.AbstractChronology.resolveDate.

Resolves parsed ChronoField values into a date during parsing.

Most TemporalField implementations are resolved using the resolve method on the field. By contrast, the ChronoField class defines fields that only have meaning relative to the chronology. As such, ChronoField date fields are resolved here in the context of a specific chronology.

ChronoField instances are resolved by this method, which may be overridden in subclasses.

  • EPOCH_DAY - If present, this is converted to a date and all other date fields are then cross-checked against the date.
  • PROLEPTIC_MONTH - If present, then it is split into the YEAR and MONTH_OF_YEAR. If the mode is strict or smart then the field is validated.
  • YEAR_OF_ERA and ERA - If both are present, then they are combined to form a YEAR. In lenient mode, the YEAR_OF_ERA range is not validated, in smart and strict mode it is. The ERA is validated for range in all three modes. If only the YEAR_OF_ERA is present, and the mode is smart or lenient, then the last available era is assumed. In strict mode, no era is assumed and the YEAR_OF_ERA is left untouched. If only the ERA is present, then it is left untouched.
  • YEAR, MONTH_OF_YEAR and DAY_OF_MONTH - If all three are present, then they are combined to form a date. In all three modes, the YEAR is validated. If the mode is smart or strict, then the month and day are validated. If the mode is lenient, then the date is combined in a manner equivalent to creating a date on the first day of the first month in the requested year, then adding the difference in months, then the difference in days. If the mode is smart, and the day-of-month is greater than the maximum for the year-month, then the day-of-month is adjusted to the last day-of-month. If the mode is strict, then the three fields must form a valid date.
  • YEAR and DAY_OF_YEAR - If both are present, then they are combined to form a date. In all three modes, the YEAR is validated. If the mode is lenient, then the date is combined in a manner equivalent to creating a date on the first day of the requested year, then adding the difference in days. If the mode is smart or strict, then the two fields must form a valid date.
  • YEAR, MONTH_OF_YEAR, ALIGNED_WEEK_OF_MONTH and ALIGNED_DAY_OF_WEEK_IN_MONTH - If all four are present, then they are combined to form a date. In all three modes, the YEAR is validated. If the mode is lenient, then the date is combined in a manner equivalent to creating a date on the first day of the first month in the requested year, then adding the difference in months, then the difference in weeks, then in days. If the mode is smart or strict, then the all four fields are validated to their outer ranges. The date is then combined in a manner equivalent to creating a date on the first day of the requested year and month, then adding the amount in weeks and days to reach their values. If the mode is strict, the date is additionally validated to check that the day and week adjustment did not change the month.
  • YEAR, MONTH_OF_YEAR, ALIGNED_WEEK_OF_MONTH and DAY_OF_WEEK - If all four are present, then they are combined to form a date. The approach is the same as described above for years, months and weeks in ALIGNED_DAY_OF_WEEK_IN_MONTH. The day-of-week is adjusted as the next or same matching day-of-week once the years, months and weeks have been handled.
  • YEAR, ALIGNED_WEEK_OF_YEAR and ALIGNED_DAY_OF_WEEK_IN_YEAR - If all three are present, then they are combined to form a date. In all three modes, the YEAR is validated. If the mode is lenient, then the date is combined in a manner equivalent to creating a date on the first day of the requested year, then adding the difference in weeks, then in days. If the mode is smart or strict, then the all three fields are validated to their outer ranges. The date is then combined in a manner equivalent to creating a date on the first day of the requested year, then adding the amount in weeks and days to reach their values. If the mode is strict, the date is additionally validated to check that the day and week adjustment did not change the year.
  • YEAR, ALIGNED_WEEK_OF_YEAR and DAY_OF_WEEK - If all three are present, then they are combined to form a date. The approach is the same as described above for years and weeks in ALIGNED_DAY_OF_WEEK_IN_YEAR. The day-of-week is adjusted as the next or same matching day-of-week once the years and weeks have been handled.

The default implementation is suitable for most calendar systems. If java.time.temporal.ChronoField#YEAR_OF_ERA is found without an java.time.temporal.ChronoField#ERA then the last era in eras() is used. The implementation assumes a 7 day week, that the first day-of-month has the value 1, that first day-of-year has the value 1, and that the first of the month and year always exists.

Parameters
fieldValues:Map<TemporalField, Long>

the map of fields to values, which can be updated, not null

resolverStyle:ResolverStyle

the requested type of resolve, not null

Returns:DiscordianDate

the resolved date, null if insufficient information to create a date

Annotations
@Override
zonedDateTimeback to summary
public ChronoZonedDateTime<DiscordianDate> zonedDateTime(TemporalAccessor temporal)

Overrides default java.time.chrono.Chronology.zonedDateTime.

Obtains a Discordian zoned date-time from another date-time object.

Parameters
temporal:TemporalAccessor

the date-time object to convert, not null

Returns:ChronoZonedDateTime<DiscordianDate>

the Discordian zoned date-time, not null

Annotations
@Override
@SuppressWarnings:unchecked
Exceptions
DateTimeException:
if unable to create the date-time
zonedDateTimeback to summary
public ChronoZonedDateTime<DiscordianDate> zonedDateTime(Instant instant, ZoneId zone)

Overrides default java.time.chrono.Chronology.zonedDateTime.

Obtains a Discordian zoned date-time in this chronology from an Instant.

Parameters
instant:Instant

the instant to create the date-time from, not null

zone:ZoneId

the time-zone, not null

Returns:ChronoZonedDateTime<DiscordianDate>

the Discordian zoned date-time, not null

Annotations
@Override
@SuppressWarnings:unchecked
Exceptions
DateTimeException:
if the result exceeds the supported range