import { GregorianChange, Calendar, YearOrDate } from './calendar';
import { DateAndTime, YMDDate } from './common';
import { Timezone } from './timezone';
export declare type DateTimeArg = number | string | DateAndTime | {
    tai: number;
} | Date | number[] | null;
export declare enum DateTimeField {
    BAD_FIELD,
    FULL = -1,
    MILLI = 0,
    MILLI_TAI = 1,
    SECOND = 2,
    SECOND_TAI = 3,
    MINUTE = 4,
    MINUTE_TAI = 5,
    HOUR_12 = 6,
    HOUR = 7,
    HOUR_TAI = 8,
    AM_PM = 9,
    DAY = 10,
    DAY_TAI = 11,
    DAY_BY_WEEK = 12,
    DAY_BY_WEEK_LOCALE = 13,
    DAY_OF_YEAR = 14,
    WEEK = 15,
    WEEK_LOCALE = 16,
    MONTH = 17,
    QUARTER = 18,
    YEAR = 19,
    YEAR_WEEK = 20,
    YEAR_WEEK_LOCALE = 21,
    ERA = 22
}
export declare type DateTimeFieldName = 'milli' | 'millis' | 'millisecond' | 'milliseconds' | 'second' | 'seconds' | 'minute' | 'minutes' | 'hour12' | 'hours12' | 'hour' | 'hours' | 'ampm' | 'am_pm' | 'day' | 'days' | 'date' | 'dayByWeek' | 'dayByWeekLocale' | 'dayOfYear' | 'week' | 'weeks' | 'weekLocale' | 'month' | 'months' | 'quarter' | 'quarters' | 'year' | 'years' | 'yearWeek' | 'yearWeekLocale' | 'era' | 'milli_tai' | 'millis_tai' | 'millisecond_tai' | 'milliseconds_tai' | 'second_tai' | 'seconds_tai' | 'minute_tai' | 'minutes_tai' | 'hour_tai' | 'hours_tai' | 'day_tai' | 'days_tai';
export interface Discontinuity {
    start: string;
    end: string;
    delta: number;
}
export declare class DateTime extends Calendar {
    private static defaultCenturyBase;
    private static defaultLocale;
    private static defaultTimezone;
    private static defaultTimezoneExplicit;
    private _deltaTaiMillis;
    private _epochMillis;
    private _error;
    private _leapSecondMillis;
    private _locale;
    private _timezone;
    private _wallTime;
    private wallTimeCounter;
    static INVALID_DATE: DateTime;
    static julianDay(millis: number): number;
    static millisFromJulianDay(jd: number): number;
    static julianDay_SGC(year: number, month: number, day: number, hour?: number, minute?: number, second?: number): number;
    static getDefaultCenturyBase(): number;
    static setDefaultCenturyBase(newBase: number): void;
    static getDefaultLocale(): string | string[];
    static setDefaultLocale(newLocale: string | string[]): void;
    static getDefaultTimezone(): Timezone;
    static setDefaultTimezone(newZone: Timezone | string): void;
    static isDateTime(obj: any): obj is DateTime;
    static compare(d1: DateTime, d2: DateTime | string | number | Date, resolution?: DateTimeField | DateTimeFieldName): number;
    /**
     * While TAI millis is generally the best way to compare two dates for sort order, two non-TAI DateTime instances
     * might have different epochMillis, but identical taiMillis, because of rounding errors. On the other hand, two
     * non-TAI instances might have identical epochMillis during a leap second, with leapSecondMillis being the only
     * distinguishing difference. TAI is the only reasonable way to compare a TAI DateTime and a non-TAI DateTime.
     */
    static milliCompare(d1: DateTime, d2: DateTime): number;
    constructor(initialTime?: DateTimeArg, timezone?: Timezone | string | null, gregorianChange?: GregorianChange);
    constructor(initialTime?: DateTimeArg, timezone?: Timezone | string | null, locale?: string | string[], gregorianChange?: GregorianChange);
    clone(cloneLock?: boolean): this;
    get type(): 'ZONELESS' | 'DATELESS' | 'DATETIME';
    get valid(): boolean;
    get error(): string | undefined;
    throwIfInvalid(): this;
    get epochMillis(): number;
    set epochMillis(newTime: number);
    get epochSeconds(): number;
    set epochSeconds(newTime: number);
    get leapSecondMillis(): number;
    get deltaTaiMillis(): number;
    isJustBeforeNegativeLeapSecond(): boolean;
    isInLeapSecond(): boolean;
    get utcMillis(): number;
    set utcMillis(newTime: number);
    setUtcMillis(newTime: number, leapSecondMillis?: number): this;
    get utcTimeMillis(): number;
    set utcTimeMillis(newTime: number);
    get utcSeconds(): number;
    set utcSeconds(newTime: number);
    get utcTimeSeconds(): number;
    set utcTimeSeconds(newTime: number);
    get taiMillis(): number;
    set taiMillis(newTime: number);
    get taiSeconds(): number;
    set taiSeconds(newTime: number);
    toDate(): Date;
    isTai(): boolean;
    isUtcBased(): boolean;
    private getWallTime;
    get wallTime(): DateAndTime;
    set wallTime(newTime: DateAndTime);
    get wallTimeShort(): DateAndTime;
    get wallTimeSparse(): DateAndTime;
    get wallTimeLong(): DateAndTime;
    get timezone(): Timezone;
    set timezone(newZone: Timezone);
    tz(newZone: Timezone | string, keepLocalTime?: boolean): this;
    utc(keepLocalTime?: boolean): this;
    local(keepLocalTime?: boolean): this;
    toLocale(newLocale: string | string[]): this;
    get locale(): string | string[];
    set locale(newLocale: string | string[]);
    get utcOffsetSeconds(): number;
    get utcOffsetMinutes(): number;
    get dstOffsetSeconds(): number;
    get dstOffsetMinutes(): number;
    isDST(): boolean;
    getTimezoneDisplayName(): string;
    private checkDateless;
    private undefinedIfDateless;
    add(field: DateTimeField | DateTimeFieldName, amount: number, variableDays?: boolean): this;
    subtract(field: DateTimeField | DateTimeFieldName, amount: number, variableDays?: boolean): this;
    roll(field: DateTimeField | DateTimeFieldName, amount: number, minYear?: number, maxYear?: number): this;
    get(field: DateTimeField | DateTimeFieldName): number;
    set(field: DateTimeField | DateTimeFieldName, value: number, loose?: boolean): this;
    startOf(field: DateTimeField | DateTimeFieldName): this;
    endOf(field: DateTimeField | DateTimeFieldName): this;
    compare(other: DateTime | string | number | Date, resolution?: DateTimeField | DateTimeFieldName): number;
    isBefore(other: DateTime | string | number | Date, resolution?: DateTimeField | DateTimeFieldName): boolean;
    isSameOrBefore(other: DateTime | string | number | Date, resolution?: DateTimeField | DateTimeFieldName): boolean;
    isSame(other: DateTime | string | number | Date, resolution?: DateTimeField | DateTimeFieldName): boolean;
    isSameOrAfter(other: DateTime | string | number | Date, resolution?: DateTimeField | DateTimeFieldName): boolean;
    isAfter(other: DateTime | string | number | Date, resolution?: DateTimeField | DateTimeFieldName): boolean;
    isBetween(low: DateTime | string | number | Date, high: DateTime | string | number | Date, resolution?: DateTimeField | DateTimeFieldName): boolean;
    getStartOfDayMillis(yearOrDate?: YearOrDate, month?: number, day?: number): number;
    getSecondsInDay(yearOrDate?: YearOrDate, month?: number, day?: number): number;
    getMinutesInDay(yearOrDate?: YearOrDate, month?: number, day?: number): number;
    getDiscontinuityDuringDay(yearOrDate?: YearOrDate, month?: number, day?: number): Discontinuity | null;
    getCalendarMonth(year: number, month: number, startingDayOfWeek?: number): YMDDate[];
    getCalendarMonth(startingDayOfWeek?: number): YMDDate[];
    format(fmt?: string, localeOverride?: string | string[]): string;
    toString(): string;
    toYMDhmString(): string;
    toIsoString(maxLength?: number): string;
    toHoursAndMinutesString(includeDst?: boolean): string;
    private updateEpochMillisFromWallTime;
    computeEpochMillisFromWallTime(wallTime: DateAndTime): number;
    computeUtcMillisFromWallTime(wallTime: DateAndTime): number;
    computeTaiMillisFromWallTime(wallTime: DateAndTime): number;
    private computeEpochMillisFromWallTimeAux;
    private updateWallTimeFromEpochMillis;
    getTimeOfDayFieldsFromMillis(millis: number, day?: number, extra?: number): DateAndTime;
    setGregorianChange(gcYearOrDate: YearOrDate | string, gcMonth?: number, gcDate?: number): this;
    getDayNumber(yearOrDate: YearOrDate, month?: number, day?: number): number;
    getFirstDateInMonth(year?: number, month?: number): number;
    getLastDateInMonth(year?: number, month?: number): number;
    getDaysInMonth(year?: number, month?: number): number;
    getDaysInYear(year?: number): number;
    isLeapYear(year?: number): boolean;
    getDayOfWeek(): number;
    getDayOfWeek(year: number, month: number, day: number): number;
    getDayOfWeek(date: YMDDate | number[]): number;
    getDateOfNthWeekdayOfMonth(year: number, month: number, dayOfTheWeek: number, index: number): number;
    getDateOfNthWeekdayOfMonth(dayOfTheWeek: number, index: number): number;
    getDayOfWeekInMonthCount(year: number, month: number, dayOfTheWeek: number): number;
    getDayOfWeekInMonthCount(dayOfTheWeek: number): number;
    getDayOfWeekInMonthIndex(year: number, month: number, day: number): number;
    getDayOfWeekInMonthIndex(date: YMDDate | number[]): number;
    getDayOfWeekInMonthIndex(): number;
    getDayOnOrAfter(year: number, month: number, dayOfTheWeek: number, minDate: number): number;
    getDayOnOrAfter(dayOfTheWeek: number, minDate: number): number;
    getDayOnOrBefore(year: number, month: number, dayOfTheWeek: number, maxDate: number): number;
    getDayOnOrBefore(dayOfTheWeek: number, minDate: number): number;
    addDaysToDate(deltaDays: number, yearOrDate: YearOrDate, month?: number, day?: number): YMDDate;
    addDaysToDate(deltaDays: number): YMDDate;
    getMissingDateRange(year?: number, month?: number): number[] | null;
    getStartDateOfFirstWeekOfYear(year: number, startingDayOfWeek?: number, minDaysInCalendarYear?: number): YMDDate;
    getWeeksInYear(year: number, startingDayOfWeek?: number, minDaysInCalendarYear?: number): number;
    getWeeksInYearLocale(year: number): number;
    getYearWeekAndWeekday(year: number, month: number, day: number, startingDayOfWeek?: number, minDaysInCalendarYear?: number): number[];
    getYearWeekAndWeekday(date: YearOrDate | number, startingDayOfWeek?: number, minDaysInCalendarYear?: number): number[];
    getYearWeekAndWeekdayLocale(year: number, month: number, day: number): number[];
    getYearWeekAndWeekdayLocale(date: YearOrDate | number): number[];
}
//# sourceMappingURL=date-time.d.ts.map