import { CalendarDate } from './CalendarDate'; /** An interface that is compatible with any object with date fields. */ export interface AnyCalendarDate { readonly calendar: Calendar; readonly era: string; readonly year: number; readonly month: number; readonly day: number; copy(): this; } /** An interface that is compatible with any object with time fields. */ export interface AnyTime { readonly hour: number; readonly minute: number; readonly second: number; readonly millisecond: number; copy(): this; } /** An interface that is compatible with any object with both date and time fields. */ export interface AnyDateTime extends AnyCalendarDate, AnyTime { } export type CalendarIdentifier = 'gregory' | 'buddhist' | 'chinese' | 'coptic' | 'dangi' | 'ethioaa' | 'ethiopic' | 'hebrew' | 'indian' | 'islamic' | 'islamic-umalqura' | 'islamic-tbla' | 'islamic-civil' | 'islamic-rgsa' | 'iso8601' | 'japanese' | 'persian' | 'roc'; /** * The Calendar interface represents a calendar system, including information * about how days, months, years, and eras are organized, and methods to perform * arithmetic on dates. */ export interface Calendar { /** * A string identifier for the calendar, as defined by Unicode CLDR. * See [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/supportedValuesOf#supported_calendar_types). */ identifier: CalendarIdentifier; /** Creates a CalendarDate in this calendar from the given Julian day number. */ fromJulianDay(jd: number): CalendarDate; /** Converts a date in this calendar to a Julian day number. */ toJulianDay(date: AnyCalendarDate): number; /** Returns the number of days in the month of the given date. */ getDaysInMonth(date: AnyCalendarDate): number; /** Returns the number of months in the year of the given date. */ getMonthsInYear(date: AnyCalendarDate): number; /** Returns the number of years in the era of the given date. */ getYearsInEra(date: AnyCalendarDate): number; /** Returns a list of era identifiers for the calendar. */ getEras(): string[]; /** * Returns the minimum month number of the given date's year. * Normally, this is 1, but in some calendars such as the Japanese, * eras may begin in the middle of a year. */ getMinimumMonthInYear?(date: AnyCalendarDate): number; /** * Returns the minimum day number of the given date's month. * Normally, this is 1, but in some calendars such as the Japanese, * eras may begin in the middle of a month. */ getMinimumDayInMonth?(date: AnyCalendarDate): number; /** Returns the maximum months across all years. */ getMaximumMonthsInYear(): number; /** Returns the maximum days across all months. */ getMaximumDaysInMonth(): number; /** * Returns a date that is the first day of the month for the given date. * This is used to determine the month that the given date falls in, if * the calendar has months that do not align with the standard calendar months * (e.g. fiscal calendars). */ getFormattableMonth?(date: AnyCalendarDate): CalendarDate; /** Returns whether the given calendar is the same as this calendar. */ isEqual?(calendar: Calendar): boolean; /** @private */ balanceDate?(date: AnyCalendarDate): void; /** @private */ balanceYearMonth?(date: AnyCalendarDate, previousDate: AnyCalendarDate): void; /** @private */ constrainDate?(date: AnyCalendarDate): void; /** @private */ isInverseEra?(date: AnyCalendarDate): boolean; } /** Represents an amount of time in calendar-specific units, for use when performing arithmetic. */ export interface DateDuration { /** The number of years to add or subtract. */ years?: number; /** The number of months to add or subtract. */ months?: number; /** The number of weeks to add or subtract. */ weeks?: number; /** The number of days to add or subtract. */ days?: number; } /** Represents an amount of time, for use whe performing arithmetic. */ export interface TimeDuration { /** The number of hours to add or subtract. */ hours?: number; /** The number of minutes to add or subtract. */ minutes?: number; /** The number of seconds to add or subtract. */ seconds?: number; /** The number of milliseconds to add or subtract. */ milliseconds?: number; } /** Represents an amount of time with both date and time components, for use when performing arithmetic. */ export interface DateTimeDuration extends DateDuration, TimeDuration { } export interface DateFields { era?: string; year?: number; month?: number; day?: number; } export interface TimeFields { hour?: number; minute?: number; second?: number; millisecond?: number; } export type DateField = keyof DateFields; export type TimeField = keyof TimeFields; export type Disambiguation = 'compatible' | 'earlier' | 'later' | 'reject'; export interface CycleOptions { /** Whether to round the field value to the nearest interval of the amount. */ round?: boolean; } export interface CycleTimeOptions extends CycleOptions { /** * Whether to use 12 or 24 hour time. If 12 hour time is chosen, the resulting value * will remain in the same day period as the original value (e.g. if the value is AM, * the resulting value also be AM). * @default 24 */ hourCycle?: 12 | 24; }