import { Duration, DurationUnit, TDuration } from '../duration.js';
import { asDate, formatDate, strftime } from '../format.js';
import { DateObject, daysInMonth, daysInYear, isLeapYear, maxDate, minDate, weeksInYear } from './utils.js';
export { asDate, daysInMonth, daysInYear, formatDate, isLeapYear, maxDate, minDate, strftime, weeksInYear };
export { DateObject };
export declare type DateInput = number | string | Date;
export declare type DateLike = DateInput | IntlDate | DateObject;
/**
 * Creates a date tied to a given locale (default system locale) which can be formatted in that locale's language using the native {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl Intl Apis} directly or using a formatting string.
 * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl Intl Apis}
 */
export declare class IntlDate {
    private _date;
    readonly locale?: string;
    intlRelativeFormat: Intl.RelativeTimeFormat;
    /** Parses the provided value as UTC date or returns the current UTC date. */
    static UTC(value?: DateLike, locale?: string): IntlDate;
    /** Returns the current local date and time.*/
    static now(): IntlDate;
    /** Creates a new date from a Unix timestamp (seconds since the unix epoch) */
    static unix(seconds: number): IntlDate;
    /**
     * Creates a new `IntlDate` in local time and specified locale (default is system locale).
     * **Note:** The allowed values for `month` start at 1, which is different from legacy `Date`
     * @param {DateLike} obj The date value (default is current local time)
     * @param {Object} opts The options for this date
     * @param {boolean?} opts.utc Converts input or current time to UTC
     * @param {string?} opts.locale A locale string to use for this date
     * @returns
     */
    constructor(obj?: DateLike, { locale, utc }?: any);
    /** Get the date's year. */
    get year(): number;
    /** Get the this date's month as a number from 1 to 12, inclusive. */
    get month(): number;
    /** Returns the weekday as a number between 1 and 7, inclusive, where Monday is 1 and Sunday is 7. */
    get dayOfWeek(): number;
    /** Get the this date's current day of the month. */
    get day(): number;
    /** Get the this date's current hour. */
    get hour(): number;
    /** Get the this date's current minute. */
    get minute(): number;
    /** Get the this date's current second. */
    get second(): number;
    /** Get the this date's current millisecond. */
    get millisecond(): number;
    isValid(): boolean;
    /** Get the number of days in this date's month. */
    daysInMonth(): number;
    /** Get the number of days in this date's year. */
    daysInYear(): number;
    dayOfYear(): number;
    /** Returns `true` if this date's year is a leap year. */
    isLeapYear(): boolean;
    /** Gets the number of weeks according to locale in the current year. */
    weeksInYear(): number;
    /** Gets the number of weeks in the current year, according to ISO weeks. */
    isoWeeksInYear(): number;
    /** Returns the current week of the year. */
    week(): any;
    /** Returns the ISO week of the year. */
    isoWeek(): any;
    /**
     * Returns a localized string representation of this date.
     * @param {Intl.DateTimeFormatOptions} opts The options to use for the format
     * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat Intl.DateTimeFormat()}
     */
    toString(opts?: Intl.DateTimeFormatOptions): string;
    /**
     * Returns a localized string representation of this date, according to the given format string. Format codes use the same specification as {@link https://momentjs.com/docs/#/displaying/format/ moment}.
     * @param {string} str The format string to use
     * @see {@link https://momentjs.com/docs/#/displaying/format/ List of formats}
     * @example
  ```js
  new IntlDate().format('MM/DD/YYYY') // '10/31/2022'
  ```
     */
    format(str: string): string;
    /**
     * Returns a new copy of the native `Date` object used by this instance.
     * @returns {Date} A new `Date` object
     */
    toDate(): Date;
    /**
     * Returns the number of seconds since the Unix Epoch (January 1, 1970 UTC).
     * @see {@link IntlDate.timestamp}
     * @see {@link IntlDate.unix}
     * @example
  ```js
  new IntlDate().toSeconds() // 1318874398
  ```
     */
    toSeconds(): number;
    /**
     * Returns the number of seconds since the Unix Epoch (January 1, 1970 UTC).
     * @see {@link IntlDate.toSeconds}
     * @see {@link IntlDate.unix}
     * @example
  ```js
  new IntlDate().timestamp() // 1318874398
  ```
     */
    timestamp(): number;
    /**
     * Returns the number of seconds since the Unix Epoch (January 1, 1970 UTC).
     * @see {@link IntlDate.toSeconds}
     * @see {@link IntlDate.timestamp}
     * @example
  ```js
  new IntlDate().unix() // 1318874398
  ```
     */
    unix(): number;
    /** Formats a string to the ISO8601 standard.
     * @example
  ```js
  new IntlDate().toISOString() // '2022-10-31T22:44:30.652Z'
  ```
     */
    toISOString(): string;
    /** Returns the date part formatted as ISO8601.
     * @example
  ```js
  new IntlDate().toISODate() // '2022-10-31'
  ```
     */
    toISODate(): string;
    /** Returns the time part formatted as ISO8601.
     * @example
  ```js
  new IntlDate().toISOTime() // 'T22:44:30.652Z'
  ```
     */
    toISOTime(): string;
    /**
     * Returns an object containing year, month, day-of-month, hours, minutes, seconds, milliseconds.
     * @returns {Object} An object like `{year, month, date, hours, minutes, seconds, ms}`
     */
    toObject(): DateObject;
    /** Returns the number of milliseconds since the Unix Epoch (January 1, 1970 UTC)  */
    getTime(): number;
    /** Alias of {@link IntlDate.getTime}  */
    valueOf(): number;
    /** Returns the timezone string name  */
    zoneName(): string;
    /** Returns the timezone GMT offset as a string  */
    zone(): string;
    /** Returns the difference in `minutes` between this date and UTC  */
    utcOffset(): number;
    /**
     * Check if this date is before another date. The other value will be parsed as an `IntlDate` if not already so.
     * @param {DateLike} other Another date or date like object
     * @returns {boolean} Returns `true` if this date is before the given value
     */
    isBefore(other: DateLike): boolean;
    /**
     * Check if this date is strictly after the given `start` and before `stop` dates. The values will be parsed as an `IntlDate` if not already so.
     * @param {DateLike} start The smaller date
     * @param {DateLike} stop The larger date
     * @returns {boolean} Returns `true` if this date is greater than `start` and less than `stop`.
     */
    isBetween(start: DateLike, stop: DateLike): boolean;
    /**
     * Check if this date is after another date. The other value will be parsed as an `IntlDate` if not already so.
     * @param {DateLike} other Another date or date like object
     * @returns {boolean} Returns `true` if this date is after the given value
     */
    isAfter(other: DateLike): boolean;
    /**
     * Check if this date is the same as `other`.
     * @param other Another date object
     * @returns {boolean} Returns `true` if this date is the same as other
     */
    isSame(other: Date | IntlDate): boolean;
    lt(other: Date | IntlDate): boolean;
    eq(other: Date | IntlDate): boolean;
    compare(other: Date | IntlDate): number;
    set(values: DateObject): IntlDate;
    get relativeFormat(): Intl.RelativeTimeFormat;
    relativeTime(n: number, unit?: Intl.RelativeTimeFormatUnit): string;
    fromNow(unit?: Intl.RelativeTimeFormatUnit): string;
    from(other: DateLike, unit?: Intl.RelativeTimeFormatUnit): string;
    toNow(unit?: Intl.RelativeTimeFormatUnit): string;
    to(other: DateLike, unit?: Intl.RelativeTimeFormatUnit): string;
    diff(other: DateLike, unit?: DurationUnit, exact?: boolean): number;
    add(duration: TDuration, exact?: boolean): IntlDate;
    subtract(duration: TDuration, exact?: boolean): IntlDate;
    startOf(unit: DurationUnit): IntlDate;
    endOf(unit: DurationUnit): IntlDate;
    clone(date?: DateLike): IntlDate;
    static max(...args: any[]): any;
    static min(...args: any[]): any;
    inspect(): string;
}
export declare function addDuration(date: DateInput, duration: number | Duration | TDuration, exact?: boolean): Date;
/**
 * Subtract the specified years, months, weeks, days, hours, minutes and seconds from the given date.
 * @param date
 * @param duration
 * @param exact
 * @returns
 */
export declare function subDuration(date: DateInput, duration: number | Duration | TDuration, exact?: boolean): Date;
