type AbsoluteDuration = {
    readonly millis?: number;
    readonly seconds?: number;
    readonly minutes?: number;
    readonly hours?: number;
    readonly days?: number;
};
type RelativeDuration = {
    readonly months?: number;
    readonly years?: number;
};
type DurationComponents = AbsoluteDuration & RelativeDuration;
type DurationLike = number | DurationComponents | Duration;
type OrdinalDate = {
    year: number;
    dayOfYear: number;
};
type CalendarDate = {
    year: number;
    month: number;
    dayOfMonth: number;
};
type TimeComponents = {
    hour: number;
    minute: number;
    second: number;
    millisecond: number;
};
type DateTimeFormat = 'YYYY' | 'YYYY-MM-DD' | 'YYYY-DDD' | 'HH:mm:ss';
type DateTimeComponents = (OrdinalDate & Partial<TimeComponents>) | (CalendarDate & Partial<TimeComponents>);
type DateLike = {
    getTime(): number;
};
type DateTimeLike = number | string | DateTime | DateLike | DateTimeComponents;

/**
 * Duration options
 */
type DurationOptions = {
    /**
     * Round the duration to the nearest integer:
     * - `true` rounds up or down to the nearest integer
     * - `'up'` rounds up to the nearest integer
     * - `'down'` rounds down to the nearest integer
     */
    round?: 'up' | 'down' | true;
};
/**
 * A `Duration` represents a length of time.
 */
declare class Duration {
    private value;
    private constructor();
    /**
     * Creates a `Duration` object from an absolute duration.
     * @deprecated Use `Duration.from` instead.
     */
    static of(duration: AbsoluteDuration): Duration;
    /**
     * Creates a `Duration` object from an absolute duration.
     */
    static from(duration: AbsoluteDuration): Duration;
    /**
     * Creates a `Duration` object from the difference between two `DateTimeLike` objects.
     * @deprecated Use `Duration.between` instead.
     */
    static diff(start: DateTimeLike, end: DateTimeLike): Duration;
    /**
     * Creates a `Duration` object from the difference between two `DateTimeLike` objects.
     */
    static between(start: DateTimeLike, end: DateTimeLike): Duration;
    /**
     * Creates a `Duration` object from a number of days.
     */
    static days(days: number): Duration;
    /**
     * Creates a `Duration` object from a number of hours.
     */
    static hours(hours: number): Duration;
    /**
     * Creates a `Duration` object from a number of minutes.
     */
    static minutes(minutes: number): Duration;
    /**
     * Creates a `Duration` object from a number of seconds.
     */
    static seconds(seconds: number): Duration;
    /**
     * Creates a `Duration` object from a number of milliseconds.
     */
    static millis(millis: number): Duration;
    /**
     * Returns the number of milliseconds of the `Duration` object.
     */
    millis(): number;
    /**
     * Returns the number of seconds of the `Duration` object.
     */
    seconds(options?: DurationOptions): number;
    /**
     * Returns the number of minutes of the `Duration` object.
     */
    minutes(options?: DurationOptions): number;
    /**
     * Returns the number of hours of the `Duration` object.
     */
    hours(options?: DurationOptions): number;
    /**
     * Returns the number of days of the `Duration` object.
     */
    days(options?: DurationOptions): number;
    /**
     * Returns the ISO string representation of the `Duration` object.
     * Example: "P2DT4H12M30S"
     */
    iso(): string;
    /**
     * Returns a new `Duration` object by adding a duration to the current `Duration` object.
     */
    plus(duration: AbsoluteDuration): Duration;
    /**
     * Returns a new `Duration` object by subtracting a duration from the current `Duration` object.
     */
    minus(duration: AbsoluteDuration): Duration;
    /**
     * Returns a new `Duration` object with the absolute value of the current `Duration` object.
     */
    abs(): Duration;
    /**
     * Returns the ISO string representation of the `Duration` object.
     */
    toString(): string;
    /**
     * Returns the milliseconds of the `Duration` object when coercing to a number
     */
    valueOf(): number;
    private return;
}

/**
 * An `Interval` represents a time span between two `DateTime` objects.
 */
declare class Interval {
    private start;
    private end;
    private constructor();
    /**
     * Creates a new Interval between two DateTimeLike values
     */
    static between(start: DateTimeLike, end: DateTimeLike): Interval;
    /**
     * Creates a new Interval starting from now and extending for the specified number of days
     */
    static days(days: number): Interval;
    /**
     * Returns the number of milliseconds between the start and end of the interval.
     */
    millis(): number;
    /**
     * Returns the duration between the start and end of the interval.
     */
    duration(): Duration;
    /**
     * Returns the start DateTime of the interval.
     */
    starts(): DateTime;
    /**
     * Returns the end DateTime of the interval.
     */
    ends(): DateTime;
    /**
     * Returns the ISO string representation of the interval.
     */
    iso(): string;
    toString(): string;
    /**
     * Returns an array of DateTime objects for each day in the interval, going from start to end.
     * The day of the end date is only included if it is not exactly at the start of a day.
     *
     * @example
     * - `2024-01-01T00:00:00.000Z` to `2024-01-02T00:00:00.000Z` will include only `2024-01-01`
     * - `2024-01-01T00:00:00.000Z` to `2024-01-02T23:59:59.999Z` will include both `2024-01-01` and `2024-01-02`
     */
    days(): Array<DateTime>;
    /**
     * Returns an array of DateTime objects for each year in the interval, going from start to end.
     * The year of the end date is only included if it is not exactly at the start of a year.
     *
     * @example
     * - `2024-01-01T00:00:00.000Z` to `2025-01-01T00:00:00.000Z` will include only `2024`
     * - `2024-01-01T00:00:00.000Z` to `2025-01-01T23:59:59.999Z` will include both `2024` and `2025`
     */
    years(): Array<DateTime>;
    /**
     * Returns true if the Interval contains the specified DateTime.
     */
    contains(dateTime: DateTimeLike): boolean;
}

type FormatLike = DateTimeFormat | Intl.DateTimeFormat;
/**
 * A `DateTime` represents a point in time.
 */
declare class DateTime {
    private value;
    private constructor();
    /**
     * Returns the number of milliseconds elapsed since midnight, January 1, 1970 Universal Coordinated Time (UTC).
     */
    static millis(): number;
    /**
     * Returns a new DateTime object representing the current date and time.
     */
    static now(): DateTime;
    /**
     * Returns a new DateTime object from a DateTimeLike value.
     */
    static from(dateTime: DateTimeLike): DateTime;
    /**
     * Creates an Interval from this DateTime to the specified end DateTime
     */
    until(end: DateTimeLike): Interval;
    /**
     * Formats the DateTime according to the specified format
     */
    format(format: FormatLike): string;
    /**
     * Returns the number of milliseconds of the DateTime object.
     */
    millis(): number;
    /**
     * Returns the ISO string representation of the DateTime object.
     */
    iso(): string;
    /**
     * Returns the number of seconds since the Unix Epoch. The value is floored to the nearest integer.
     */
    timestamp(): number;
    /**
     * Returns the JavaScript Date object representation of the DateTime object.
     */
    date(): Date;
    /**
     * Returns the year for the current DateTime object.
     */
    year(): number;
    /**
     * Returns the day of the year (1-365/366) for the current DateTime object.
     */
    dayOfYear(): number;
    /**
     * Returns the day of the month (1-31) for the current DateTime object.
     */
    dayOfMonth(): number;
    /**
     * Returns the month of the year (1-12) for the current DateTime object.
     */
    month(): number;
    /**
     * Returns the hour of the day (0-23) for the current DateTime object.
     */
    hour(): number;
    /**
     * Returns the minute of the hour (0-59) for the current DateTime object.
     */
    minute(): number;
    /**
     * Returns the second of the minute (0-59) for the current DateTime object.
     */
    second(): number;
    /**
     * Returns a new DateTime object by adding a duration to the current DateTime object.
     */
    plus(duration: DurationLike): DateTime;
    /**
     * Returns a new DateTime object by subtracting a duration from the current DateTime object.
     */
    minus(duration: DurationLike): DateTime;
    /**
     * Returns the ISO string representation of the DateTime object.
     */
    toString(): string;
    /**
     * Returns the milliseconds value when coercing to a number
     */
    valueOf(): number;
    /**
     * Returns a new DateTime object set to the start of the second
     */
    startOfSecond(): DateTime;
    /**
     * Returns a new DateTime object set to the start of the minute
     */
    startOfMinute(): DateTime;
    /**
     * Returns a new DateTime object set to the start of the hour
     */
    startOfHour(): DateTime;
    /**
     * Returns a new DateTime object set to the start of the day
     */
    startOfDay(): DateTime;
    /**
     * Returns a new DateTime object set to the start of the month
     */
    startOfMonth(): DateTime;
    /**
     * Returns a new DateTime object set to the start of the year
     */
    startOfYear(): DateTime;
    /**
     * Returns a new DateTime object set to the end of the second
     */
    endOfSecond(): DateTime;
    /**
     * Returns a new DateTime object set to the end of the minute
     */
    endOfMinute(): DateTime;
    /**
     * Returns a new DateTime object set to the end of the hour
     */
    endOfHour(): DateTime;
    /**
     * Returns a new DateTime object set to the end of the day
     */
    endOfDay(): DateTime;
    /**
     * Returns a new DateTime object set to the end of the month
     */
    endOfMonth(): DateTime;
    /**
     * Returns a new DateTime object set to the end of the year
     */
    endOfYear(): DateTime;
    /**
     * Checks if the current DateTime is at the start of the second
     */
    isStartOfSecond(): boolean;
    /**
     * Checks if the current DateTime is at the start of the minute
     */
    isStartOfMinute(): boolean;
    /**
     * Checks if the current DateTime is at the start of the hour
     */
    isStartOfHour(): boolean;
    /**
     * Checks if the current DateTime is at the start of the day
     */
    isStartOfDay(): boolean;
    /**
     * Checks if the current DateTime is at the start of the month
     */
    isStartOfMonth(): boolean;
    /**
     * Checks if the current DateTime is at the start of the year
     */
    isStartOfYear(): boolean;
    /**
     * Checks if the current DateTime is at the end of the second
     */
    isEndOfSecond(): boolean;
    /**
     * Checks if the current DateTime is at the end of the minute
     */
    isEndOfMinute(): boolean;
    /**
     * Checks if the current DateTime is at the end of the hour
     */
    isEndOfHour(): boolean;
    /**
     * Checks if the current DateTime is at the end of the day
     */
    isEndOfDay(): boolean;
    /**
     * Checks if the current DateTime is at the end of the month
     */
    isEndOfMonth(): boolean;
    /**
     * Checks if the current DateTime is at the end of the year
     */
    isEndOfYear(): boolean;
    /**
     * Checks if the current DateTime is in the same second as the given DateTime
     */
    isSameSecond(dateTime: DateTimeLike): boolean;
    /**
     * Checks if the current DateTime is in the same minute as the given DateTime
     */
    isSameMinute(dateTime: DateTimeLike): boolean;
    /**
     * Checks if the current DateTime is in the same hour as the given DateTime
     */
    isSameHour(dateTime: DateTimeLike): boolean;
    /**
     * Checks if the current DateTime is in the same day as the given DateTime
     */
    isSameDay(dateTime: DateTimeLike): boolean;
    /**
     * Checks if the current DateTime is in the same month as the given DateTime
     */
    isSameMonth(dateTime: DateTimeLike): boolean;
    /**
     * Checks if the current DateTime is in the same year as the given DateTime
     */
    isSameYear(dateTime: DateTimeLike): boolean;
    /**
     * Returns true if the current DateTime is before the specified DateTime.
     */
    isBefore(dateTime: DateTimeLike): boolean;
    /**
     * Returns true if the current DateTime is after the specified DateTime.
     */
    isAfter(dateTime: DateTimeLike): boolean;
    /**
     * Returns true if the current DateTime is between the specified DateTime.
     */
    isBetween(start: DateTimeLike, end: DateTimeLike): boolean;
    /**
     * Returns a new DateTime object set to the start of the specified unit
     */
    private startOf;
    /**
     * Returns a new DateTime object set to the end of the specified unit
     */
    private endOf;
    /**
     * Checks if the current DateTime is at the start of the specified unit
     */
    private isStartOf;
    /**
     * Checks if the current DateTime is at the end of the specified unit
     */
    private isEndOf;
    /**
     * Checks if the current DateTime is in the same time unit as the given DateTime
     */
    private isSame;
    /**
     * Calculates the absolute duration in milliseconds between the current DateTime and the absolute duration.
     */
    private absoluteDuration;
    /**
     * Calculates the duration in milliseconds between the current DateTime and the relative duration.
     * The minus parameter is used to determine the direction of the duration.
     * If minus is true, the duration is subtracted from the current DateTime.
     * If minus is false, the duration is added to the current DateTime.
     * In other words, are we going back in time or forward in time?
     */
    private relativeDuration;
}

export { type AbsoluteDuration, type CalendarDate, type DateLike, DateTime, type DateTimeComponents, type DateTimeFormat, type DateTimeLike, Duration, type DurationComponents, type DurationLike, Interval, type OrdinalDate, type RelativeDuration, type TimeComponents };
