EdgeAIG's picture
download
raw
126 kB
/**
* Works with absolute instants, UTC date-times, zoned date-times, and time
* zones.
*
* A `DateTime` always represents an absolute point in time with epoch
* milliseconds. It may also carry a `TimeZone` for calendar parts, formatting,
* and zone-aware transformations. This module includes constructors, time-zone
* helpers, comparisons, date arithmetic, current-time effects, and formatting
* functions.
*
* @since 3.6.0
*/
import type { IllegalArgumentError } from "./Cause.ts"
import * as Context from "./Context.ts"
import type * as Duration from "./Duration.ts"
import * as Effect from "./Effect.ts"
import type * as Equ from "./Equivalence.ts"
import { dual, flow, type LazyArg } from "./Function.ts"
import type { Inspectable } from "./Inspectable.ts"
import * as Internal from "./internal/dateTime.ts"
import { provideService } from "./internal/effect.ts"
import * as Layer from "./Layer.ts"
import type * as Option from "./Option.ts"
import type * as order from "./Order.ts"
import type { Pipeable } from "./Pipeable.ts"
const TypeId = Internal.TypeId
const TimeZoneTypeId = Internal.TimeZoneTypeId
/**
* A `DateTime` represents a point in time. It can optionally have a time zone
* associated with it.
*
* @category models
* @since 3.6.0
*/
export type DateTime = Utc | Zoned
/**
* Represents a `DateTime` stored as an absolute UTC instant with no associated
* time zone.
*
* **Details**
*
* Use `DateTime.isUtc` to narrow a `DateTime` to this variant.
*
* @category models
* @since 3.6.0
*/
export interface Utc extends DateTime.Proto {
readonly _tag: "Utc"
readonly epochMilliseconds: number
partsUtc: DateTime.PartsWithWeekday | undefined
}
/**
* Represents a `DateTime` with an associated `TimeZone`.
*
* **Details**
*
* A zoned value still represents an absolute instant through
* `epochMilliseconds`, while the time zone is used for wall-clock parts,
* formatting, and zone-aware transformations.
*
* @category models
* @since 3.6.0
*/
export interface Zoned extends DateTime.Proto {
readonly _tag: "Zoned"
readonly epochMilliseconds: number
readonly zone: TimeZone
adjustedEpochMilliseconds: number | undefined
partsAdjusted: DateTime.PartsWithWeekday | undefined
partsUtc: DateTime.PartsWithWeekday | undefined
}
/**
* Companion namespace containing the public helper types used by `DateTime`
* constructors, parts APIs, formatting, and date/time arithmetic.
*
* @since 3.6.0
*/
export declare namespace DateTime {
/**
* Input accepted by `DateTime.make`, `DateTime.makeUnsafe`, and the zoned
* constructors.
*
* **Details**
*
* Includes existing `DateTime` values, partial date parts, epoch-millisecond
* objects, epoch milliseconds, JavaScript `Date` instances, and parseable date
* strings.
*
* @category models
* @since 3.6.0
*/
export type Input = DateTime | Partial<Parts> | Instant | InstantWithZone | Date | number | string
/**
* Type-level helper used by constructors to preserve a zoned input.
*
* **Details**
*
* When the input type is `DateTime.Zoned`, the result type is
* `DateTime.Zoned`; otherwise the result type is `DateTime.Utc`.
*
* @category models
* @since 3.6.0
*/
export type PreserveZone<A extends DateTime.Input> = A extends Zoned ? Zoned : Utc
/**
* Date and time unit name accepted by `DateTime` rounding and arithmetic
* APIs.
*
* **Details**
*
* Includes both singular units, such as `"day"`, and plural units, such as
* `"days"`.
*
* @category models
* @since 3.6.0
*/
export type Unit = UnitSingular | UnitPlural
/**
* Singular date and time unit names used by rounding APIs such as
* `DateTime.startOf`, `DateTime.endOf`, and `DateTime.nearest`.
*
* @category models
* @since 3.6.0
*/
export type UnitSingular =
| "millisecond"
| "second"
| "minute"
| "hour"
| "day"
| "week"
| "month"
| "year"
/**
* Plural date and time unit names used by `DateTime.PartsForMath` for
* amount-based arithmetic.
*
* @category models
* @since 3.6.0
*/
export type UnitPlural =
| "milliseconds"
| "seconds"
| "minutes"
| "hours"
| "days"
| "weeks"
| "months"
| "years"
/**
* Calendar and time components of a `DateTime`, including the weekday.
*
* **Details**
*
* `month` is one-based (`1` for January through `12` for December), and
* `weekDay` follows JavaScript `Date#getUTCDay` numbering (`0` for Sunday
* through `6` for Saturday).
*
* @category models
* @since 3.6.0
*/
export interface PartsWithWeekday {
readonly millisecond: number
readonly second: number
readonly minute: number
readonly hour: number
readonly day: number
readonly weekDay: number
readonly month: number
readonly year: number
}
/**
* Calendar and time components of a `DateTime`, without weekday information.
*
* **Details**
*
* `month` is one-based (`1` for January through `12` for December).
*
* @category models
* @since 3.6.0
*/
export interface Parts {
readonly millisecond: number
readonly second: number
readonly minute: number
readonly hour: number
readonly day: number
readonly month: number
readonly year: number
}
/**
* Plural amount fields accepted by `DateTime.add` and `DateTime.subtract`.
*
* **Details**
*
* Each field represents the number of units to add or subtract for that part.
*
* @category models
* @since 3.6.0
*/
export interface PartsForMath {
readonly milliseconds: number
readonly seconds: number
readonly minutes: number
readonly hours: number
readonly days: number
readonly weeks: number
readonly months: number
readonly years: number
}
/**
* Object input representing an absolute instant as milliseconds since the Unix
* epoch.
*
* @category models
* @since 4.0.0
*/
export interface Instant {
readonly epochMilliseconds: number
}
/**
* Object input representing an absolute instant plus a time zone identifier.
*
* **Details**
*
* `DateTime.makeZoned` and `DateTime.makeZonedUnsafe` use `timeZoneId` when
* no explicit `timeZone` option is supplied.
*
* @category models
* @since 4.0.0
*/
export interface InstantWithZone {
readonly timeZoneId: string
readonly epochMilliseconds: number
}
/**
* Shared protocol implemented by all `DateTime` values.
*
* **Details**
*
* Provides the `DateTime` type identifier along with pipe and inspection
* support.
*
* @category models
* @since 3.6.0
*/
export interface Proto extends Pipeable, Inspectable {
readonly [TypeId]: typeof TypeId
}
}
/**
* Represents a time zone used by `DateTime.Zoned`.
*
* **Details**
*
* A `TimeZone` is either a fixed offset from UTC or a named IANA time zone.
*
* @category models
* @since 3.6.0
*/
export type TimeZone = TimeZone.Offset | TimeZone.Named
/**
* Companion namespace containing the public variant and protocol types for
* `TimeZone`.
*
* @since 3.6.0
*/
export declare namespace TimeZone {
/**
* Shared protocol implemented by all `TimeZone` values.
*
* **Details**
*
* Provides the `TimeZone` type identifier and inspection support.
*
* @category models
* @since 3.6.0
*/
export interface Proto extends Inspectable {
readonly [TimeZoneTypeId]: typeof TimeZoneTypeId
}
/**
* Fixed-offset time zone.
*
* **Details**
*
* The `offset` is measured in milliseconds from UTC. Positive offsets are
* ahead of UTC, and negative offsets are behind UTC.
*
* @category models
* @since 3.6.0
*/
export interface Offset extends Proto {
readonly _tag: "Offset"
readonly offset: number
}
/**
* Named IANA time zone.
*
* **Details**
*
* The `id` field contains the resolved time zone identifier, such as
* `"Europe/London"` or `"America/New_York"`.
*
* @category models
* @since 3.6.0
*/
export interface Named extends Proto {
readonly _tag: "Named"
readonly id: string
/** @internal */
readonly format: Intl.DateTimeFormat
}
}
/**
* A `Disambiguation` is used to resolve ambiguities when a `DateTime` is
* ambiguous, such as during a daylight saving time transition.
*
* **Details**
*
* For more information, see the [Temporal documentation](https://tc39.es/proposal-temporal/docs/timezone.html#ambiguity-due-to-dst-or-other-time-zone-offset-changes)
*
* - `"compatible"`: (default) Behavior matching Temporal API and legacy JavaScript Date and moment.js.
* For repeated times, chooses the earlier occurrence. For gap times, chooses the later interpretation.
*
* - `"earlier"`: For repeated times, always choose the earlier occurrence.
* For gap times, choose the time before the gap.
*
* - `"later"`: For repeated times, always choose the later occurrence.
* For gap times, choose the time after the gap.
*
* - `"reject"`: Throw an `RangeError` when encountering ambiguous or non-existent times.
*
* **Example** (Resolving ambiguous local times)
*
* ```ts
* import { DateTime } from "effect"
*
* // Fall-back example: 01:30 on Nov 2, 2025 in New York happens twice
* const ambiguousTime = { year: 2025, month: 11, day: 2, hours: 1, minutes: 30 }
* const timeZone = DateTime.zoneMakeNamedUnsafe("America/New_York")
*
* DateTime.makeZoned(ambiguousTime, {
* timeZone,
* adjustForTimeZone: true,
* disambiguation: "earlier"
* })
* // Earlier occurrence (DST time): 2025-11-02T05:30:00.000Z
*
* DateTime.makeZoned(ambiguousTime, {
* timeZone,
* adjustForTimeZone: true,
* disambiguation: "later"
* })
* // Later occurrence (standard time): 2025-11-02T06:30:00.000Z
*
* // Gap example: 02:30 on Mar 9, 2025 in New York doesn't exist
* const gapTime = { year: 2025, month: 3, day: 9, hours: 2, minutes: 30 }
*
* DateTime.makeZoned(gapTime, {
* timeZone,
* adjustForTimeZone: true,
* disambiguation: "earlier"
* })
* // Time before gap: 2025-03-09T06:30:00.000Z (01:30 EST)
*
* DateTime.makeZoned(gapTime, {
* timeZone,
* adjustForTimeZone: true,
* disambiguation: "later"
* })
* // Time after gap: 2025-03-09T07:30:00.000Z (03:30 EDT)
* ```
*
* @category models
* @since 3.18.0
*/
export type Disambiguation = "compatible" | "earlier" | "later" | "reject"
// =============================================================================
// guards
// =============================================================================
/**
* Checks whether a value is a `DateTime`.
*
* **When to use**
*
* Use to narrow an unknown value before treating it as a `DateTime`.
*
* @see {@link isUtc} for narrowing a known `DateTime` to UTC
* @see {@link isZoned} for narrowing a known `DateTime` to zoned
*
* @category guards
* @since 3.6.0
*/
export const isDateTime: (u: unknown) => u is DateTime = Internal.isDateTime
/**
* Checks whether a value is a `TimeZone`.
*
* **When to use**
*
* Use to narrow unknown input to any `TimeZone` before passing it to APIs that
* accept either fixed-offset or named time zones.
*
* @see {@link isTimeZoneOffset} for narrowing to fixed-offset time zones
* @see {@link isTimeZoneNamed} for narrowing to named time zones
*
* @category guards
* @since 3.6.0
*/
export const isTimeZone: (u: unknown) => u is TimeZone = Internal.isTimeZone
/**
* Checks whether a value is an offset-based `TimeZone`.
*
* **When to use**
*
* Use when you need to narrow an unknown or union `TimeZone` value to the
* fixed-offset variant before reading its offset in milliseconds.
*
* @see {@link isTimeZone} for checking either time zone variant
* @see {@link isTimeZoneNamed} for narrowing to named time zones
*
* @category guards
* @since 3.6.0
*/
export const isTimeZoneOffset: (u: unknown) => u is TimeZone.Offset = Internal.isTimeZoneOffset
/**
* Checks whether a value is a named `TimeZone` (IANA time zone).
*
* **When to use**
*
* Use to narrow an unknown value to the `TimeZone.Named` variant before
* reading named-zone fields such as `id`.
*
* @see {@link isTimeZone} for checking either time zone variant
* @see {@link isTimeZoneOffset} for narrowing to fixed-offset time zones
*
* @category guards
* @since 3.6.0
*/
export const isTimeZoneNamed: (u: unknown) => u is TimeZone.Named = Internal.isTimeZoneNamed
/**
* Checks whether a `DateTime` is a UTC `DateTime` (no time zone information).
*
* **When to use**
*
* Use to narrow a `DateTime` before passing it to code that requires a UTC
* value without an associated time zone.
*
* @see {@link isZoned} for narrowing to zoned date-times
* @see {@link match} for handling both UTC and zoned cases
*
* @category guards
* @since 3.6.0
*/
export const isUtc: (self: DateTime) => self is Utc = Internal.isUtc
/**
* Checks whether a `DateTime` is a zoned `DateTime` (has time zone information).
*
* **When to use**
*
* Use to narrow a known `DateTime` before reading its zone or passing it to
* APIs that require `DateTime.Zoned`.
*
* @see {@link isUtc} for narrowing to UTC date-times
* @see {@link match} for handling both UTC and zoned cases
*
* @category guards
* @since 3.6.0
*/
export const isZoned: (self: DateTime) => self is Zoned = Internal.isZoned
// =============================================================================
// instances
// =============================================================================
/**
* Provides an `Equivalence` for comparing two `DateTime` values for equality.
*
* **Details**
*
* Two `DateTime` values are considered equivalent if they represent the same
* point in time, regardless of their time zone.
*
* **Example** (Comparing DateTime values for equivalence)
*
* ```ts
* import { DateTime } from "effect"
*
* const utc = DateTime.makeUnsafe("2024-01-01T12:00:00Z")
* const zoned = DateTime.makeZonedUnsafe("2024-01-01T12:00:00Z", {
* timeZone: "Europe/London"
* })
*
* console.log(DateTime.Equivalence(utc, zoned)) // true
* ```
*
* @category instances
* @since 3.6.0
*/
export const Equivalence: Equ.Equivalence<DateTime> = Internal.Equivalence
/**
* Provides an `Order` for comparing and sorting `DateTime` values.
*
* **Details**
*
* `DateTime` values are ordered by their epoch milliseconds, so earlier times
* come before later times regardless of time zone.
*
* **Example** (Sorting DateTime values chronologically)
*
* ```ts
* import { Array, DateTime } from "effect"
*
* const dates = [
* DateTime.makeUnsafe("2024-03-01"),
* DateTime.makeUnsafe("2024-01-01"),
* DateTime.makeUnsafe("2024-02-01")
* ]
*
* const sorted = Array.sort(dates, DateTime.Order)
* // Results in chronological order: 2024-01-01, 2024-02-01, 2024-03-01
* ```
*
* @category instances
* @since 3.6.0
*/
export const Order: order.Order<DateTime> = Internal.Order
/**
* Returns a `DateTime` constrained between a minimum and maximum value.
*
* **Details**
*
* If the `DateTime` is before the minimum, the minimum is returned.
* If the `DateTime` is after the maximum, the maximum is returned.
* Otherwise, the original `DateTime` is returned.
*
* **Example** (Clamping DateTime values)
*
* ```ts
* import { DateTime } from "effect"
*
* const min = DateTime.makeUnsafe("2024-01-01")
* const max = DateTime.makeUnsafe("2024-12-31")
* const date = DateTime.makeUnsafe("2025-06-15")
*
* const clamped = DateTime.clamp(date, { minimum: min, maximum: max })
* // clamped equals max (2024-12-31)
* ```
*
* @category ordering
* @since 3.6.0
*/
export const clamp: {
/**
* Returns a `DateTime` constrained between a minimum and maximum value.
*
* **Details**
*
* If the `DateTime` is before the minimum, the minimum is returned.
* If the `DateTime` is after the maximum, the maximum is returned.
* Otherwise, the original `DateTime` is returned.
*
* **Example** (Clamping DateTime values)
*
* ```ts
* import { DateTime } from "effect"
*
* const min = DateTime.makeUnsafe("2024-01-01")
* const max = DateTime.makeUnsafe("2024-12-31")
* const date = DateTime.makeUnsafe("2025-06-15")
*
* const clamped = DateTime.clamp(date, { minimum: min, maximum: max })
* // clamped equals max (2024-12-31)
* ```
*
* @category ordering
* @since 3.6.0
*/
<Min extends DateTime, Max extends DateTime>(options: { readonly minimum: Min; readonly maximum: Max }): <A extends DateTime>(self: A) => A | Min | Max
/**
* Returns a `DateTime` constrained between a minimum and maximum value.
*
* **Details**
*
* If the `DateTime` is before the minimum, the minimum is returned.
* If the `DateTime` is after the maximum, the maximum is returned.
* Otherwise, the original `DateTime` is returned.
*
* **Example** (Clamping DateTime values)
*
* ```ts
* import { DateTime } from "effect"
*
* const min = DateTime.makeUnsafe("2024-01-01")
* const max = DateTime.makeUnsafe("2024-12-31")
* const date = DateTime.makeUnsafe("2025-06-15")
*
* const clamped = DateTime.clamp(date, { minimum: min, maximum: max })
* // clamped equals max (2024-12-31)
* ```
*
* @category ordering
* @since 3.6.0
*/
<A extends DateTime, Min extends DateTime, Max extends DateTime>(self: A, options: { readonly minimum: Min; readonly maximum: Max }): A | Min | Max
} = Internal.clamp
// =============================================================================
// constructors
// =============================================================================
/**
* Create a `DateTime` from a `Date`.
*
* **Details**
*
* If the `Date` is invalid, an `IllegalArgumentError` will be thrown.
*
* **Example** (Creating DateTime values from Dates)
*
* ```ts
* import { DateTime } from "effect"
*
* const date = new Date("2024-01-01T12:00:00Z")
* const dateTime = DateTime.fromDateUnsafe(date)
*
* console.log(DateTime.formatIso(dateTime)) // "2024-01-01T12:00:00.000Z"
* ```
*
* @category constructors
* @since 4.0.0
*/
export const fromDateUnsafe: (date: Date) => Utc = Internal.fromDateUnsafe
/**
* Create a `DateTime` from supported input values.
*
* **When to use**
*
* Use when creating a `DateTime` from trusted input and construction failures
* should throw an `IllegalArgumentError` instead of returning `Option.none`.
*
* **Details**
*
* - A `DateTime`
* - A `Date` instance (invalid dates will throw an `IllegalArgumentError`)
* - The `number` of milliseconds since the Unix epoch
* - An object with the parts of a date
* - A `string` that can be parsed by `Date.parse`
*
* **Example** (Creating DateTime values unsafely)
*
* ```ts
* import { DateTime } from "effect"
*
* // from Date
* const fromDate = DateTime.makeUnsafe(new Date("2024-01-01T12:00:00Z"))
* console.log(DateTime.formatIso(fromDate)) // "2024-01-01T12:00:00.000Z"
*
* // from parts
* const fromParts = DateTime.makeUnsafe({ year: 2024 })
* console.log(DateTime.formatIso(fromParts)) // "2024-01-01T00:00:00.000Z"
*
* // from string
* const fromString = DateTime.makeUnsafe("2024-01-01")
* console.log(DateTime.formatIso(fromString)) // "2024-01-01T00:00:00.000Z"
* ```
*
* @category constructors
* @since 4.0.0
*/
export const makeUnsafe: <A extends DateTime.Input>(input: A) => DateTime.PreserveZone<A> = Internal.makeUnsafe
/**
* Create a `DateTime.Zoned` using `DateTime.makeUnsafe` and a time zone.
*
* **When to use**
*
* Use when the date/time input and zone options are trusted and invalid or
* rejected ambiguous times should throw instead of returning `Option.none`.
*
* **Details**
*
* The input is treated as UTC and then the time zone is attached, unless
* `adjustForTimeZone` is set to `true`. In that case, the input is treated as
* already in the time zone.
*
* When `adjustForTimeZone` is true and ambiguous times occur during DST transitions,
* the `disambiguation` option controls how to resolve the ambiguity:
* - `compatible` (default): Choose earlier time for repeated times, later for gaps
* - `earlier`: Always choose the earlier of two possible times
* - `later`: Always choose the later of two possible times
* - `reject`: Throw an error when ambiguous times are encountered
*
* **Example** (Creating zoned DateTime values unsafely)
*
* ```ts
* import { DateTime } from "effect"
*
* const zoned = DateTime.makeZonedUnsafe("2024-06-15T14:30:00Z", {
* timeZone: "Europe/London"
* })
*
* console.log(DateTime.formatIsoZoned(zoned)) // "2024-06-15T15:30:00.000+01:00[Europe/London]"
* ```
*
* @category constructors
* @since 4.0.0
*/
export const makeZonedUnsafe: (input: DateTime.Input, options?: {
readonly timeZone?: number | string | TimeZone | undefined
readonly adjustForTimeZone?: boolean | undefined
readonly disambiguation?: Disambiguation | undefined
}) => Zoned = Internal.makeZonedUnsafe
/**
* Creates a `DateTime.Zoned` safely from an input and a time zone.
*
* **Details**
*
* By default, the input is interpreted as a UTC instant and the time zone is
* attached without changing that instant. When `adjustForTimeZone` is `true`,
* the input is interpreted as wall-clock time in the target zone.
*
* When `adjustForTimeZone` is `true`, `disambiguation` controls
* daylight-saving gaps and repeated times:
*
* - `"compatible"` (default): chooses the earlier occurrence for repeated
* times and the later interpretation for gaps
* - `"earlier"`: chooses the earlier possible instant
* - `"later"`: chooses the later possible instant
* - `"reject"`: rejects ambiguous or nonexistent wall-clock times
*
* Returns `Some` when construction succeeds, or `None` when the input, time
* zone, or disambiguation cannot be resolved.
*
* **Example** (Creating optional zoned DateTime values)
*
* ```ts
* import { DateTime } from "effect"
*
* const result = DateTime.makeZoned("2024-06-15T14:30:00Z", {
* timeZone: "Europe/London"
* })
*
* console.log(result._tag) // "Some"
* if (result._tag === "Some") {
* console.log(DateTime.formatIsoZoned(result.value)) // "2024-06-15T15:30:00.000+01:00[Europe/London]"
* }
* ```
*
* @category constructors
* @since 3.6.0
*/
export const makeZoned: (
input: DateTime.Input,
options?: {
readonly timeZone?: number | string | TimeZone | undefined
readonly adjustForTimeZone?: boolean | undefined
readonly disambiguation?: Disambiguation | undefined
}
) => Option.Option<Zoned> = Internal.makeZoned
/**
* Creates a `DateTime` safely from supported input values.
*
* **Details**
*
* - A `DateTime`
* - A JavaScript `Date`
* - The number of milliseconds since the Unix epoch
* - An object with date and time parts
* - A string that can be parsed as a date
*
* Returns `Some` with the constructed `DateTime` when the input is valid, or
* `None` when construction would fail, including invalid `Date` instances or
* unparseable strings.
*
* **Example** (Creating optional DateTime values)
*
* ```ts
* import { DateTime } from "effect"
*
* // from Date
* const fromDate = DateTime.make(new Date("2024-01-01T12:00:00Z"))
* console.log(fromDate._tag) // "Some"
*
* // from parts
* const fromParts = DateTime.make({ year: 2024 })
* console.log(fromParts._tag) // "Some"
*
* // from string
* const fromString = DateTime.make("2024-01-01")
* console.log(fromString._tag) // "Some"
*
* const invalid = DateTime.make("not a date")
* console.log(invalid._tag) // "None"
* ```
*
* @category constructors
* @since 3.6.0
*/
export const make: <A extends DateTime.Input>(input: A) => Option.Option<DateTime.PreserveZone<A>> = Internal.make
/**
* Parses an ISO zoned date-time string into a `DateTime.Zoned` safely.
*
* **Details**
*
* Accepts named-zone strings such as
* `YYYY-MM-DDTHH:mm:ss.sss+HH:MM[Time/Zone]` and offset-only strings such as
* `YYYY-MM-DDTHH:mm:ss.sss+HH:MM`. Returns `None` when the input cannot be
* parsed.
*
* **Example** (Parsing zoned DateTime strings)
*
* ```ts
* import { DateTime } from "effect"
*
* const result1 = DateTime.makeZonedFromString(
* "2024-01-01T12:00:00+02:00[Europe/Berlin]"
* )
* console.log(result1._tag === "Some") // true
*
* const result2 = DateTime.makeZonedFromString("2024-01-01T12:00:00Z")
* console.log(result2._tag === "Some") // true
*
* const invalid = DateTime.makeZonedFromString("invalid")
* console.log(invalid._tag === "None") // true
* ```
*
* @category constructors
* @since 3.6.0
*/
export const makeZonedFromString: (input: string) => Option.Option<Zoned> = Internal.makeZonedFromString
/**
* Gets the current time using the `Clock` service and convert it to a `DateTime`.
*
* **Example** (Getting the current DateTime)
*
* ```ts
* import { DateTime, Effect } from "effect"
*
* Effect.gen(function*() {
* const now = yield* DateTime.nowAsDate
* console.log(now instanceof Date) // true
* })
* ```
*
* @category constructors
* @since 3.6.0
*/
export const now: Effect.Effect<Utc> = Internal.now
/**
* Gets the current time from the `Clock` service and returns it as a
* JavaScript `Date`.
*
* **Example** (Getting the current Date)
*
* ```ts
* import { DateTime, Effect } from "effect"
*
* Effect.gen(function*() {
* const now = yield* DateTime.now
* })
* ```
*
* @category constructors
* @since 3.14.0
*/
export const nowAsDate: Effect.Effect<Date> = Internal.nowAsDate
/**
* Gets the current time using `Date.now`.
*
* **When to use**
*
* Use when synchronous wall-clock access outside an Effect program is
* acceptable and testability through the `Clock` service is not needed.
*
* **Details**
*
* This is a synchronous version of `now` that directly uses `Date.now()`
* instead of the Effect `Clock` service.
*
* **Example** (Getting the current DateTime unsafely)
*
* ```ts
* import { DateTime } from "effect"
*
* const now = DateTime.nowUnsafe()
* console.log(DateTime.formatIso(now))
* ```
*
* @category constructors
* @since 4.0.0
*/
export const nowUnsafe: LazyArg<Utc> = Internal.nowUnsafe
// =============================================================================
// time zones
// =============================================================================
/**
* Converts a `DateTime` to a UTC `DateTime`.
*
* **When to use**
*
* Use to represent the same instant in UTC instead of its current time zone.
*
* **Details**
*
* The returned value keeps the same epoch milliseconds and changes only the
* `DateTime` representation to UTC.
*
* **Example** (Converting DateTime values to UTC)
*
* ```ts
* import { DateTime } from "effect"
*
* const now = DateTime.makeZonedUnsafe({ year: 2024 }, {
* timeZone: "Europe/London"
* })
*
* // set as UTC
* const utc: DateTime.Utc = DateTime.toUtc(now)
* ```
*
* @category time zones
* @since 3.13.0
*/
export const toUtc: (self: DateTime) => Utc = Internal.toUtc
/**
* Sets the time zone of a `DateTime`, returning a new `DateTime.Zoned`.
*
* **Example** (Setting time zones)
*
* ```ts
* import { DateTime, Effect } from "effect"
*
* Effect.gen(function*() {
* const now = yield* DateTime.now
* const zone = DateTime.zoneMakeNamedUnsafe("Europe/London")
*
* // set the time zone
* const zoned: DateTime.Zoned = DateTime.setZone(now, zone)
* })
* ```
*
* @category time zones
* @since 3.6.0
*/
export const setZone: {
/**
* Sets the time zone of a `DateTime`, returning a new `DateTime.Zoned`.
*
* **Example** (Setting time zones)
*
* ```ts
* import { DateTime, Effect } from "effect"
*
* Effect.gen(function*() {
* const now = yield* DateTime.now
* const zone = DateTime.zoneMakeNamedUnsafe("Europe/London")
*
* // set the time zone
* const zoned: DateTime.Zoned = DateTime.setZone(now, zone)
* })
* ```
*
* @category time zones
* @since 3.6.0
*/
(
zone: TimeZone,
options?: {
readonly adjustForTimeZone?: boolean | undefined
readonly disambiguation?: Disambiguation | undefined
}
): (self: DateTime) => Zoned
/**
* Sets the time zone of a `DateTime`, returning a new `DateTime.Zoned`.
*
* **Example** (Setting time zones)
*
* ```ts
* import { DateTime, Effect } from "effect"
*
* Effect.gen(function*() {
* const now = yield* DateTime.now
* const zone = DateTime.zoneMakeNamedUnsafe("Europe/London")
*
* // set the time zone
* const zoned: DateTime.Zoned = DateTime.setZone(now, zone)
* })
* ```
*
* @category time zones
* @since 3.6.0
*/
(
self: DateTime,
zone: TimeZone,
options?: {
readonly adjustForTimeZone?: boolean | undefined
readonly disambiguation?: Disambiguation | undefined
}
): Zoned
} = Internal.setZone
/**
* Adds a fixed offset time zone to a `DateTime`.
*
* **Details**
*
* The offset is in milliseconds.
*
* **Example** (Setting fixed-offset time zones)
*
* ```ts
* import { DateTime, Effect } from "effect"
*
* Effect.gen(function*() {
* const now = yield* DateTime.now
*
* // set the offset time zone in milliseconds
* const zoned: DateTime.Zoned = DateTime.setZoneOffset(now, 3 * 60 * 60 * 1000)
* })
* ```
*
* @category time zones
* @since 3.6.0
*/
export const setZoneOffset: {
/**
* Adds a fixed offset time zone to a `DateTime`.
*
* **Details**
*
* The offset is in milliseconds.
*
* **Example** (Setting fixed-offset time zones)
*
* ```ts
* import { DateTime, Effect } from "effect"
*
* Effect.gen(function*() {
* const now = yield* DateTime.now
*
* // set the offset time zone in milliseconds
* const zoned: DateTime.Zoned = DateTime.setZoneOffset(now, 3 * 60 * 60 * 1000)
* })
* ```
*
* @category time zones
* @since 3.6.0
*/
(
offset: number,
options?: {
readonly adjustForTimeZone?: boolean | undefined
readonly disambiguation?: Disambiguation | undefined
}
): (self: DateTime) => Zoned
/**
* Adds a fixed offset time zone to a `DateTime`.
*
* **Details**
*
* The offset is in milliseconds.
*
* **Example** (Setting fixed-offset time zones)
*
* ```ts
* import { DateTime, Effect } from "effect"
*
* Effect.gen(function*() {
* const now = yield* DateTime.now
*
* // set the offset time zone in milliseconds
* const zoned: DateTime.Zoned = DateTime.setZoneOffset(now, 3 * 60 * 60 * 1000)
* })
* ```
*
* @category time zones
* @since 3.6.0
*/
(
self: DateTime,
offset: number,
options?: {
readonly adjustForTimeZone?: boolean | undefined
readonly disambiguation?: Disambiguation | undefined
}
): Zoned
} = Internal.setZoneOffset
/**
* Attempts to create a named time zone from an IANA time zone identifier.
*
* **When to use**
*
* Use when the IANA zone id is trusted and invalid zones should throw instead
* of returning `Option.none` or failing in `Effect`.
*
* **Details**
*
* If the time zone is invalid, an `IllegalArgumentError` will be thrown.
*
* **Example** (Creating named time zones unsafely)
*
* ```ts
* import { DateTime } from "effect"
*
* const londonZone = DateTime.zoneMakeNamedUnsafe("Europe/London")
* console.log(DateTime.zoneToString(londonZone)) // "Europe/London"
*
* const tokyoZone = DateTime.zoneMakeNamedUnsafe("Asia/Tokyo")
* console.log(DateTime.zoneToString(tokyoZone)) // "Asia/Tokyo"
*
* // This would throw an IllegalArgumentError:
* // DateTime.zoneMakeNamedUnsafe("Invalid/Zone")
* ```
*
* @category time zones
* @since 4.0.0
*/
export const zoneMakeNamedUnsafe: (zoneId: string) => TimeZone.Named = Internal.zoneMakeNamedUnsafe
/**
* Create a fixed offset time zone.
*
* **Details**
*
* The offset is specified in milliseconds from UTC. Positive values are
* ahead of UTC, negative values are behind UTC.
*
* **Example** (Creating fixed-offset time zones)
*
* ```ts
* import { DateTime } from "effect"
*
* // Create a time zone with +3 hours offset
* const zone = DateTime.zoneMakeOffset(3 * 60 * 60 * 1000)
*
* const dt = DateTime.makeZonedUnsafe("2024-01-01T12:00:00Z", {
* timeZone: zone
* })
* ```
*
* @category time zones
* @since 3.6.0
*/
export const zoneMakeOffset: (offset: number) => TimeZone.Offset = Internal.zoneMakeOffset
/**
* Creates a named time zone safely from an IANA time zone identifier.
*
* **Details**
*
* If the time zone is invalid, `None` will be returned.
*
* **Example** (Creating optional named time zones)
*
* ```ts
* import { DateTime } from "effect"
*
* const validZone = DateTime.zoneMakeNamed("Europe/London")
* console.log(validZone._tag === "Some") // true
*
* const invalidZone = DateTime.zoneMakeNamed("Invalid/Zone")
* console.log(invalidZone._tag === "None") // true
* ```
*
* @category time zones
* @since 3.6.0
*/
export const zoneMakeNamed: (zoneId: string) => Option.Option<TimeZone.Named> = Internal.zoneMakeNamed
/**
* Creates a named time zone effectfully from an IANA time zone identifier.
*
* **When to use**
*
* Use when invalid IANA zone ids should fail in the Effect error channel
* instead of returning `Option.none` or throwing.
*
* **Example** (Creating named time zones effectfully)
*
* ```ts
* import { DateTime, Effect } from "effect"
*
* const program = Effect.gen(function*() {
* const zone = yield* DateTime.zoneMakeNamedEffect("Europe/London")
* const now = yield* DateTime.now
* return DateTime.setZone(now, zone)
* })
* ```
*
* @category time zones
* @since 3.6.0
*/
export const zoneMakeNamedEffect: (zoneId: string) => Effect.Effect<TimeZone.Named, IllegalArgumentError> =
Internal.zoneMakeNamedEffect
/**
* Create a named time zone from the system's local time zone.
*
* **Details**
*
* This uses the system's configured time zone, which may vary depending
* on the runtime environment.
*
* **Example** (Creating local time zones)
*
* ```ts
* import { DateTime } from "effect"
*
* const localZone = DateTime.zoneMakeLocal()
* console.log(DateTime.zoneToString(localZone)) // Output depends on system time zone
* ```
*
* @category time zones
* @since 3.6.0
*/
export const zoneMakeLocal: () => TimeZone.Named = Internal.zoneMakeLocal
/**
* Tries to parse a `TimeZone` from a string safely.
*
* **Details**
*
* Supports both IANA time zone identifiers and offset formats like "+03:00".
*
* **Example** (Parsing time zones)
*
* ```ts
* import { DateTime } from "effect"
*
* const namedZone = DateTime.zoneFromString("Europe/London")
* const offsetZone = DateTime.zoneFromString("+03:00")
* const invalid = DateTime.zoneFromString("invalid")
*
* console.log(namedZone._tag === "Some") // true
* console.log(offsetZone._tag === "Some") // true
* console.log(invalid._tag === "None") // true
* ```
*
* @category time zones
* @since 3.6.0
*/
export const zoneFromString: (zone: string) => Option.Option<TimeZone> = Internal.zoneFromString
/**
* Formats a `TimeZone` as a string.
*
* **Example** (Formatting time zones)
*
* ```ts
* import { DateTime } from "effect"
*
* // Outputs "+03:00"
* DateTime.zoneToString(DateTime.zoneMakeOffset(3 * 60 * 60 * 1000))
*
* // Outputs "Europe/London"
* DateTime.zoneToString(DateTime.zoneMakeNamedUnsafe("Europe/London"))
* ```
*
* @category time zones
* @since 3.6.0
*/
export const zoneToString: (self: TimeZone) => string = Internal.zoneToString
/**
* Sets the time zone of a `DateTime` safely from an IANA time zone identifier. If the
* time zone is invalid, `None` will be returned.
*
* **Example** (Setting named time zones safely)
*
* ```ts
* import { DateTime, Effect } from "effect"
*
* Effect.gen(function*() {
* const now = yield* DateTime.now
* // set the time zone, returns an Option
* DateTime.setZoneNamed(now, "Europe/London")
* })
* ```
*
* @category time zones
* @since 3.6.0
*/
export const setZoneNamed: {
/**
* Sets the time zone of a `DateTime` safely from an IANA time zone identifier. If the
* time zone is invalid, `None` will be returned.
*
* **Example** (Setting named time zones safely)
*
* ```ts
* import { DateTime, Effect } from "effect"
*
* Effect.gen(function*() {
* const now = yield* DateTime.now
* // set the time zone, returns an Option
* DateTime.setZoneNamed(now, "Europe/London")
* })
* ```
*
* @category time zones
* @since 3.6.0
*/
(
zoneId: string,
options?: {
readonly adjustForTimeZone?: boolean | undefined
readonly disambiguation?: Disambiguation | undefined
}
): (self: DateTime) => Option.Option<Zoned>
/**
* Sets the time zone of a `DateTime` safely from an IANA time zone identifier. If the
* time zone is invalid, `None` will be returned.
*
* **Example** (Setting named time zones safely)
*
* ```ts
* import { DateTime, Effect } from "effect"
*
* Effect.gen(function*() {
* const now = yield* DateTime.now
* // set the time zone, returns an Option
* DateTime.setZoneNamed(now, "Europe/London")
* })
* ```
*
* @category time zones
* @since 3.6.0
*/
(
self: DateTime,
zoneId: string,
options?: {
readonly adjustForTimeZone?: boolean | undefined
readonly disambiguation?: Disambiguation | undefined
}
): Option.Option<Zoned>
} = Internal.setZoneNamed
/**
* Sets the time zone of a `DateTime` from an IANA time zone identifier. If the
* time zone is invalid, an `IllegalArgumentError` will be thrown.
*
* **Example** (Setting named time zones unsafely)
*
* ```ts
* import { DateTime, Effect } from "effect"
*
* Effect.gen(function*() {
* const now = yield* DateTime.now
* // set the time zone
* DateTime.setZoneNamedUnsafe(now, "Europe/London")
* })
* ```
*
* @category time zones
* @since 4.0.0
*/
export const setZoneNamedUnsafe: {
/**
* Sets the time zone of a `DateTime` from an IANA time zone identifier. If the
* time zone is invalid, an `IllegalArgumentError` will be thrown.
*
* **Example** (Setting named time zones unsafely)
*
* ```ts
* import { DateTime, Effect } from "effect"
*
* Effect.gen(function*() {
* const now = yield* DateTime.now
* // set the time zone
* DateTime.setZoneNamedUnsafe(now, "Europe/London")
* })
* ```
*
* @category time zones
* @since 4.0.0
*/
(
zoneId: string,
options?: {
readonly adjustForTimeZone?: boolean | undefined
readonly disambiguation?: Disambiguation | undefined
}
): (self: DateTime) => Zoned
/**
* Sets the time zone of a `DateTime` from an IANA time zone identifier. If the
* time zone is invalid, an `IllegalArgumentError` will be thrown.
*
* **Example** (Setting named time zones unsafely)
*
* ```ts
* import { DateTime, Effect } from "effect"
*
* Effect.gen(function*() {
* const now = yield* DateTime.now
* // set the time zone
* DateTime.setZoneNamedUnsafe(now, "Europe/London")
* })
* ```
*
* @category time zones
* @since 4.0.0
*/
(
self: DateTime,
zoneId: string,
options?: {
readonly adjustForTimeZone?: boolean | undefined
readonly disambiguation?: Disambiguation | undefined
}
): Zoned
} = Internal.setZoneNamedUnsafe
// =============================================================================
// comparisons
// =============================================================================
/**
* Computes the difference between two `DateTime` values, returning a
* `Duration` representing the amount of time between them.
*
* **Details**
*
* If `other` is *after* `self`, the result will be a positive `Duration`. If
* `other` is *before* `self`, the result will be a negative `Duration`. If they
* are equal, the result will be a `Duration` of zero.
*
* **Example** (Measuring distance between DateTime values)
*
* ```ts
* import { DateTime, Effect } from "effect"
*
* Effect.gen(function*() {
* const now = yield* DateTime.now
* const other = DateTime.add(now, { minutes: 1 })
*
* // returns Duration.minutes(1)
* DateTime.distance(now, other)
* })
* ```
*
* @category comparisons
* @since 3.6.0
*/
export const distance: {
// =============================================================================
// comparisons
// =============================================================================
/**
* Computes the difference between two `DateTime` values, returning a
* `Duration` representing the amount of time between them.
*
* **Details**
*
* If `other` is *after* `self`, the result will be a positive `Duration`. If
* `other` is *before* `self`, the result will be a negative `Duration`. If they
* are equal, the result will be a `Duration` of zero.
*
* **Example** (Measuring distance between DateTime values)
*
* ```ts
* import { DateTime, Effect } from "effect"
*
* Effect.gen(function*() {
* const now = yield* DateTime.now
* const other = DateTime.add(now, { minutes: 1 })
*
* // returns Duration.minutes(1)
* DateTime.distance(now, other)
* })
* ```
*
* @category comparisons
* @since 3.6.0
*/
(other: DateTime): (self: DateTime) => Duration.Duration
// =============================================================================
// comparisons
// =============================================================================
/**
* Computes the difference between two `DateTime` values, returning a
* `Duration` representing the amount of time between them.
*
* **Details**
*
* If `other` is *after* `self`, the result will be a positive `Duration`. If
* `other` is *before* `self`, the result will be a negative `Duration`. If they
* are equal, the result will be a `Duration` of zero.
*
* **Example** (Measuring distance between DateTime values)
*
* ```ts
* import { DateTime, Effect } from "effect"
*
* Effect.gen(function*() {
* const now = yield* DateTime.now
* const other = DateTime.add(now, { minutes: 1 })
*
* // returns Duration.minutes(1)
* DateTime.distance(now, other)
* })
* ```
*
* @category comparisons
* @since 3.6.0
*/
(self: DateTime, other: DateTime): Duration.Duration
} = Internal.distance
/**
* Returns the earlier of two `DateTime` values.
*
* **Example** (Selecting the earlier DateTime)
*
* ```ts
* import { DateTime } from "effect"
*
* const date1 = DateTime.makeUnsafe("2024-01-01")
* const date2 = DateTime.makeUnsafe("2024-02-01")
*
* const earlier = DateTime.min(date1, date2)
* // earlier equals date1 (2024-01-01)
* ```
*
* @category comparisons
* @since 3.6.0
*/
export const min: {
/**
* Returns the earlier of two `DateTime` values.
*
* **Example** (Selecting the earlier DateTime)
*
* ```ts
* import { DateTime } from "effect"
*
* const date1 = DateTime.makeUnsafe("2024-01-01")
* const date2 = DateTime.makeUnsafe("2024-02-01")
*
* const earlier = DateTime.min(date1, date2)
* // earlier equals date1 (2024-01-01)
* ```
*
* @category comparisons
* @since 3.6.0
*/
<That extends DateTime>(that: That): <Self extends DateTime>(self: Self) => Self | That
/**
* Returns the earlier of two `DateTime` values.
*
* **Example** (Selecting the earlier DateTime)
*
* ```ts
* import { DateTime } from "effect"
*
* const date1 = DateTime.makeUnsafe("2024-01-01")
* const date2 = DateTime.makeUnsafe("2024-02-01")
*
* const earlier = DateTime.min(date1, date2)
* // earlier equals date1 (2024-01-01)
* ```
*
* @category comparisons
* @since 3.6.0
*/
<Self extends DateTime, That extends DateTime>(self: Self, that: That): Self | That
} = Internal.min
/**
* Returns the later of two `DateTime` values.
*
* **Example** (Selecting the later DateTime)
*
* ```ts
* import { DateTime } from "effect"
*
* const date1 = DateTime.makeUnsafe("2024-01-01")
* const date2 = DateTime.makeUnsafe("2024-02-01")
*
* const later = DateTime.max(date1, date2)
* // later equals date2 (2024-02-01)
* ```
*
* @category comparisons
* @since 3.6.0
*/
export const max: {
/**
* Returns the later of two `DateTime` values.
*
* **Example** (Selecting the later DateTime)
*
* ```ts
* import { DateTime } from "effect"
*
* const date1 = DateTime.makeUnsafe("2024-01-01")
* const date2 = DateTime.makeUnsafe("2024-02-01")
*
* const later = DateTime.max(date1, date2)
* // later equals date2 (2024-02-01)
* ```
*
* @category comparisons
* @since 3.6.0
*/
<That extends DateTime>(that: That): <Self extends DateTime>(self: Self) => Self | That
/**
* Returns the later of two `DateTime` values.
*
* **Example** (Selecting the later DateTime)
*
* ```ts
* import { DateTime } from "effect"
*
* const date1 = DateTime.makeUnsafe("2024-01-01")
* const date2 = DateTime.makeUnsafe("2024-02-01")
*
* const later = DateTime.max(date1, date2)
* // later equals date2 (2024-02-01)
* ```
*
* @category comparisons
* @since 3.6.0
*/
<Self extends DateTime, That extends DateTime>(self: Self, that: That): Self | That
} = Internal.max
/**
* Checks whether the first `DateTime` is after the second `DateTime`.
*
* **Example** (Checking whether a DateTime is later)
*
* ```ts
* import { DateTime } from "effect"
*
* const date1 = DateTime.makeUnsafe("2024-02-01")
* const date2 = DateTime.makeUnsafe("2024-01-01")
*
* console.log(DateTime.isGreaterThan(date1, date2)) // true
* console.log(DateTime.isGreaterThan(date2, date1)) // false
* ```
*
* @category comparisons
* @since 4.0.0
*/
export const isGreaterThan: {
/**
* Checks whether the first `DateTime` is after the second `DateTime`.
*
* **Example** (Checking whether a DateTime is later)
*
* ```ts
* import { DateTime } from "effect"
*
* const date1 = DateTime.makeUnsafe("2024-02-01")
* const date2 = DateTime.makeUnsafe("2024-01-01")
*
* console.log(DateTime.isGreaterThan(date1, date2)) // true
* console.log(DateTime.isGreaterThan(date2, date1)) // false
* ```
*
* @category comparisons
* @since 4.0.0
*/
(that: DateTime): (self: DateTime) => boolean
/**
* Checks whether the first `DateTime` is after the second `DateTime`.
*
* **Example** (Checking whether a DateTime is later)
*
* ```ts
* import { DateTime } from "effect"
*
* const date1 = DateTime.makeUnsafe("2024-02-01")
* const date2 = DateTime.makeUnsafe("2024-01-01")
*
* console.log(DateTime.isGreaterThan(date1, date2)) // true
* console.log(DateTime.isGreaterThan(date2, date1)) // false
* ```
*
* @category comparisons
* @since 4.0.0
*/
(self: DateTime, that: DateTime): boolean
} = Internal.isGreaterThan
/**
* Checks whether the first `DateTime` is after or equal to the second `DateTime`.
*
* **Example** (Checking whether a DateTime is later or equal)
*
* ```ts
* import { DateTime } from "effect"
*
* const date1 = DateTime.makeUnsafe("2024-01-01")
* const date2 = DateTime.makeUnsafe("2024-01-01")
* const date3 = DateTime.makeUnsafe("2024-02-01")
*
* console.log(DateTime.isGreaterThanOrEqualTo(date1, date2)) // true
* console.log(DateTime.isGreaterThanOrEqualTo(date3, date1)) // true
* console.log(DateTime.isGreaterThanOrEqualTo(date1, date3)) // false
* ```
*
* @category comparisons
* @since 4.0.0
*/
export const isGreaterThanOrEqualTo: {
/**
* Checks whether the first `DateTime` is after or equal to the second `DateTime`.
*
* **Example** (Checking whether a DateTime is later or equal)
*
* ```ts
* import { DateTime } from "effect"
*
* const date1 = DateTime.makeUnsafe("2024-01-01")
* const date2 = DateTime.makeUnsafe("2024-01-01")
* const date3 = DateTime.makeUnsafe("2024-02-01")
*
* console.log(DateTime.isGreaterThanOrEqualTo(date1, date2)) // true
* console.log(DateTime.isGreaterThanOrEqualTo(date3, date1)) // true
* console.log(DateTime.isGreaterThanOrEqualTo(date1, date3)) // false
* ```
*
* @category comparisons
* @since 4.0.0
*/
(that: DateTime): (self: DateTime) => boolean
/**
* Checks whether the first `DateTime` is after or equal to the second `DateTime`.
*
* **Example** (Checking whether a DateTime is later or equal)
*
* ```ts
* import { DateTime } from "effect"
*
* const date1 = DateTime.makeUnsafe("2024-01-01")
* const date2 = DateTime.makeUnsafe("2024-01-01")
* const date3 = DateTime.makeUnsafe("2024-02-01")
*
* console.log(DateTime.isGreaterThanOrEqualTo(date1, date2)) // true
* console.log(DateTime.isGreaterThanOrEqualTo(date3, date1)) // true
* console.log(DateTime.isGreaterThanOrEqualTo(date1, date3)) // false
* ```
*
* @category comparisons
* @since 4.0.0
*/
(self: DateTime, that: DateTime): boolean
} = Internal.isGreaterThanOrEqualTo
/**
* Checks whether the first `DateTime` is before the second `DateTime`.
*
* **Example** (Checking whether a DateTime is earlier)
*
* ```ts
* import { DateTime } from "effect"
*
* const date1 = DateTime.makeUnsafe("2024-01-01")
* const date2 = DateTime.makeUnsafe("2024-02-01")
*
* console.log(DateTime.isLessThan(date1, date2)) // true
* console.log(DateTime.isLessThan(date2, date1)) // false
* ```
*
* @category comparisons
* @since 4.0.0
*/
export const isLessThan: {
/**
* Checks whether the first `DateTime` is before the second `DateTime`.
*
* **Example** (Checking whether a DateTime is earlier)
*
* ```ts
* import { DateTime } from "effect"
*
* const date1 = DateTime.makeUnsafe("2024-01-01")
* const date2 = DateTime.makeUnsafe("2024-02-01")
*
* console.log(DateTime.isLessThan(date1, date2)) // true
* console.log(DateTime.isLessThan(date2, date1)) // false
* ```
*
* @category comparisons
* @since 4.0.0
*/
(that: DateTime): (self: DateTime) => boolean
/**
* Checks whether the first `DateTime` is before the second `DateTime`.
*
* **Example** (Checking whether a DateTime is earlier)
*
* ```ts
* import { DateTime } from "effect"
*
* const date1 = DateTime.makeUnsafe("2024-01-01")
* const date2 = DateTime.makeUnsafe("2024-02-01")
*
* console.log(DateTime.isLessThan(date1, date2)) // true
* console.log(DateTime.isLessThan(date2, date1)) // false
* ```
*
* @category comparisons
* @since 4.0.0
*/
(self: DateTime, that: DateTime): boolean
} = Internal.isLessThan
/**
* Checks whether the first `DateTime` is before or equal to the second `DateTime`.
*
* **Example** (Checking whether a DateTime is earlier or equal)
*
* ```ts
* import { DateTime } from "effect"
*
* const date1 = DateTime.makeUnsafe("2024-01-01")
* const date2 = DateTime.makeUnsafe("2024-01-01")
* const date3 = DateTime.makeUnsafe("2024-02-01")
*
* console.log(DateTime.isLessThanOrEqualTo(date1, date2)) // true
* console.log(DateTime.isLessThanOrEqualTo(date1, date3)) // true
* console.log(DateTime.isLessThanOrEqualTo(date3, date1)) // false
* ```
*
* @category comparisons
* @since 4.0.0
*/
export const isLessThanOrEqualTo: {
/**
* Checks whether the first `DateTime` is before or equal to the second `DateTime`.
*
* **Example** (Checking whether a DateTime is earlier or equal)
*
* ```ts
* import { DateTime } from "effect"
*
* const date1 = DateTime.makeUnsafe("2024-01-01")
* const date2 = DateTime.makeUnsafe("2024-01-01")
* const date3 = DateTime.makeUnsafe("2024-02-01")
*
* console.log(DateTime.isLessThanOrEqualTo(date1, date2)) // true
* console.log(DateTime.isLessThanOrEqualTo(date1, date3)) // true
* console.log(DateTime.isLessThanOrEqualTo(date3, date1)) // false
* ```
*
* @category comparisons
* @since 4.0.0
*/
(that: DateTime): (self: DateTime) => boolean
/**
* Checks whether the first `DateTime` is before or equal to the second `DateTime`.
*
* **Example** (Checking whether a DateTime is earlier or equal)
*
* ```ts
* import { DateTime } from "effect"
*
* const date1 = DateTime.makeUnsafe("2024-01-01")
* const date2 = DateTime.makeUnsafe("2024-01-01")
* const date3 = DateTime.makeUnsafe("2024-02-01")
*
* console.log(DateTime.isLessThanOrEqualTo(date1, date2)) // true
* console.log(DateTime.isLessThanOrEqualTo(date1, date3)) // true
* console.log(DateTime.isLessThanOrEqualTo(date3, date1)) // false
* ```
*
* @category comparisons
* @since 4.0.0
*/
(self: DateTime, that: DateTime): boolean
} = Internal.isLessThanOrEqualTo
/**
* Checks whether a `DateTime` is between two other `DateTime` values (inclusive).
*
* **Example** (Checking whether a DateTime is within bounds)
*
* ```ts
* import { DateTime } from "effect"
*
* const min = DateTime.makeUnsafe("2024-01-01")
* const max = DateTime.makeUnsafe("2024-12-31")
* const date = DateTime.makeUnsafe("2024-06-15")
*
* console.log(DateTime.between(date, { minimum: min, maximum: max })) // true
* ```
*
* @category comparisons
* @since 3.6.0
*/
export const between: {
/**
* Checks whether a `DateTime` is between two other `DateTime` values (inclusive).
*
* **Example** (Checking whether a DateTime is within bounds)
*
* ```ts
* import { DateTime } from "effect"
*
* const min = DateTime.makeUnsafe("2024-01-01")
* const max = DateTime.makeUnsafe("2024-12-31")
* const date = DateTime.makeUnsafe("2024-06-15")
*
* console.log(DateTime.between(date, { minimum: min, maximum: max })) // true
* ```
*
* @category comparisons
* @since 3.6.0
*/
(options: { minimum: DateTime; maximum: DateTime }): (self: DateTime) => boolean
/**
* Checks whether a `DateTime` is between two other `DateTime` values (inclusive).
*
* **Example** (Checking whether a DateTime is within bounds)
*
* ```ts
* import { DateTime } from "effect"
*
* const min = DateTime.makeUnsafe("2024-01-01")
* const max = DateTime.makeUnsafe("2024-12-31")
* const date = DateTime.makeUnsafe("2024-06-15")
*
* console.log(DateTime.between(date, { minimum: min, maximum: max })) // true
* ```
*
* @category comparisons
* @since 3.6.0
*/
(self: DateTime, options: { minimum: DateTime; maximum: DateTime }): boolean
} = Internal.between
/**
* Checks effectfully if a `DateTime` is in the future compared to the current time.
*
* **Details**
*
* This is an effectful operation that uses the current time from the `Clock` service.
*
* **Example** (Checking future DateTime values effectfully)
*
* ```ts
* import { DateTime, Effect } from "effect"
*
* const program = Effect.gen(function*() {
* const futureDate = DateTime.add(yield* DateTime.now, { hours: 1 })
* const isFuture = yield* DateTime.isFuture(futureDate)
* console.log(isFuture) // true
* })
* ```
*
* @category comparisons
* @since 3.6.0
*/
export const isFuture: (self: DateTime) => Effect.Effect<boolean> = Internal.isFuture
/**
* Checks synchronously if a `DateTime` is in the future compared to the current time.
*
* **When to use**
*
* Use when checking whether a `DateTime` is in the future with a synchronous
* live-clock read and `Clock`-based testability is not needed.
*
* **Details**
*
* This is a synchronous version that uses `Date.now()` directly.
*
* **Example** (Checking future DateTime values unsafely)
*
* ```ts
* import { DateTime } from "effect"
*
* const now = DateTime.nowUnsafe()
* const futureDate = DateTime.add(now, { hours: 1 })
*
* console.log(DateTime.isFutureUnsafe(futureDate)) // true
* console.log(DateTime.isFutureUnsafe(now)) // false
* ```
*
* @category comparisons
* @since 4.0.0
*/
export const isFutureUnsafe: (self: DateTime) => boolean = Internal.isFutureUnsafe
/**
* Checks effectfully if a `DateTime` is in the past compared to the current time.
*
* **Details**
*
* This is an effectful operation that uses the current time from the `Clock` service.
*
* **Example** (Checking past DateTime values effectfully)
*
* ```ts
* import { DateTime, Effect } from "effect"
*
* const program = Effect.gen(function*() {
* const pastDate = DateTime.subtract(yield* DateTime.now, { hours: 1 })
* const isPast = yield* DateTime.isPast(pastDate)
* console.log(isPast) // true
* })
* ```
*
* @category comparisons
* @since 3.6.0
*/
export const isPast: (self: DateTime) => Effect.Effect<boolean> = Internal.isPast
/**
* Checks synchronously if a `DateTime` is in the past compared to the current time.
*
* **When to use**
*
* Use when checking whether a `DateTime` is in the past with a synchronous
* live-clock read and `Clock`-based testability is not needed.
*
* **Details**
*
* This is a synchronous version that uses `Date.now()` directly.
*
* **Example** (Checking past DateTime values unsafely)
*
* ```ts
* import { DateTime } from "effect"
*
* const now = DateTime.nowUnsafe()
* const pastDate = DateTime.subtract(now, { hours: 1 })
*
* console.log(DateTime.isPastUnsafe(pastDate)) // true
* console.log(DateTime.isPastUnsafe(now)) // false
* ```
*
* @category comparisons
* @since 4.0.0
*/
export const isPastUnsafe: (self: DateTime) => boolean = Internal.isPastUnsafe
// =============================================================================
// conversions
// =============================================================================
/**
* Gets the UTC `Date` of a `DateTime`.
*
* **Details**
*
* This always returns the UTC representation, ignoring any time zone information.
*
* **Example** (Converting DateTime values to UTC Dates)
*
* ```ts
* import { DateTime } from "effect"
*
* const dt = DateTime.makeZonedUnsafe("2024-01-01T12:00:00Z", {
* timeZone: "Europe/London"
* })
*
* const utcDate = DateTime.toDateUtc(dt)
* console.log(utcDate.toISOString()) // "2024-01-01T12:00:00.000Z"
* ```
*
* @category converting
* @since 3.6.0
*/
export const toDateUtc: (self: DateTime) => Date = Internal.toDateUtc
/**
* Converts a `DateTime` to a `Date`, applying the time zone first.
*
* **Details**
*
* For `DateTime.Zoned`, this adjusts for the time zone before converting.
* For `DateTime.Utc`, this is equivalent to `toDateUtc`.
*
* **Example** (Converting DateTime values to Dates)
*
* ```ts
* import { DateTime } from "effect"
*
* const utc = DateTime.makeUnsafe("2024-01-01T12:00:00Z")
* const zoned = DateTime.makeZonedUnsafe("2024-01-01T12:00:00Z", {
* timeZone: "Europe/London"
* })
*
* console.log(DateTime.toDate(utc).toISOString())
* console.log(DateTime.toDate(zoned).toISOString())
* ```
*
* @category converting
* @since 3.6.0
*/
export const toDate: (self: DateTime) => Date = Internal.toDate
/**
* Computes the time zone offset of a `DateTime.Zoned` in milliseconds.
*
* **Details**
*
* Returns the offset from UTC in milliseconds. Positive values indicate
* time zones ahead of UTC, negative values indicate time zones behind UTC.
*
* **Example** (Reading zoned offsets)
*
* ```ts
* import { DateTime } from "effect"
*
* const zoned = DateTime.makeZonedUnsafe("2024-01-01T12:00:00Z", {
* timeZone: "Europe/London"
* })
*
* const offset = DateTime.zonedOffset(zoned)
* console.log(offset) // 0 (London is UTC+0 in winter)
* ```
*
* @category converting
* @since 3.6.0
*/
export const zonedOffset: (self: Zoned) => number = Internal.zonedOffset
/**
* Formats the time zone offset of a `DateTime.Zoned` as an ISO string.
*
* **Details**
*
* The offset is formatted as "±HH:MM".
*
* **Example** (Formatting zoned offsets)
*
* ```ts
* import { DateTime } from "effect"
*
* const zoned = DateTime.makeZonedUnsafe("2024-01-01T12:00:00Z", {
* timeZone: DateTime.zoneMakeOffset(3 * 60 * 60 * 1000) // +3 hours
* })
*
* const offsetString = DateTime.zonedOffsetIso(zoned)
* console.log(offsetString) // "+03:00"
* ```
*
* @category converting
* @since 3.6.0
*/
export const zonedOffsetIso: (self: Zoned) => string = Internal.zonedOffsetIso
/**
* Gets the milliseconds since the Unix epoch of a `DateTime`.
*
* **Details**
*
* This returns the UTC timestamp regardless of any time zone information.
*
* **Example** (Reading epoch milliseconds)
*
* ```ts
* import { DateTime } from "effect"
*
* const dt = DateTime.makeUnsafe("2024-01-01T00:00:00Z")
* const epochMillis = DateTime.toEpochMillis(dt)
*
* console.log(epochMillis) // 1704067200000
* ```
*
* @category converting
* @since 3.6.0
*/
export const toEpochMillis: (self: DateTime) => number = Internal.toEpochMillis
/**
* Removes the time aspect of a `DateTime`, first adjusting for the time
* zone. It will return a `DateTime.Utc` only containing the date.
*
* **Example** (Removing time components)
*
* ```ts
* import { DateTime } from "effect"
*
* // returns "2024-01-01T00:00:00Z"
* DateTime.makeZonedUnsafe("2024-01-01T05:00:00Z", {
* timeZone: "Pacific/Auckland",
* adjustForTimeZone: true
* }).pipe(
* DateTime.removeTime,
* DateTime.formatIso
* )
* ```
*
* @category converting
* @since 3.6.0
*/
export const removeTime: (self: DateTime) => Utc = Internal.removeTime
// =============================================================================
// parts
// =============================================================================
/**
* Gets the time-zone-adjusted parts of a `DateTime` as an object.
*
* **Details**
*
* The parts will be time zone adjusted if the `DateTime` is zoned.
*
* **Example** (Reading DateTime parts)
*
* ```ts
* import { DateTime } from "effect"
*
* const dt = DateTime.makeUnsafe("2024-01-01T12:30:45.123Z")
* const parts = DateTime.toParts(dt)
*
* console.log(parts)
* // {
* // year: 2024,
* // month: 1,
* // day: 1,
* // hours: 12,
* // minutes: 30,
* // seconds: 45,
* // millis: 123,
* // weekDay: 1 // Monday
* // }
* ```
*
* @category parts
* @since 3.6.0
*/
export const toParts: (self: DateTime) => DateTime.PartsWithWeekday = Internal.toParts
/**
* Gets the UTC parts of a `DateTime` as an object.
*
* **Details**
*
* The parts will always be in UTC, ignoring any time zone information.
*
* **Example** (Reading UTC DateTime parts)
*
* ```ts
* import { DateTime } from "effect"
*
* const zoned = DateTime.makeZonedUnsafe("2024-01-01T12:30:45.123Z", {
* timeZone: "Europe/London"
* })
* const parts = DateTime.toPartsUtc(zoned)
*
* console.log(parts)
* // Always returns UTC parts regardless of time zone
* ```
*
* @category parts
* @since 3.6.0
*/
export const toPartsUtc: (self: DateTime) => DateTime.PartsWithWeekday = Internal.toPartsUtc
/**
* Gets one UTC part of a `DateTime` as a number.
*
* **Details**
*
* The part will be in the UTC time zone.
*
* **Example** (Reading UTC DateTime parts by key)
*
* ```ts
* import { DateTime } from "effect"
*
* const dateTime = DateTime.makeUnsafe({ year: 2024 })
* const year = DateTime.getPartUtc(dateTime, "year")
* console.log(year) // 2024
* ```
*
* @category parts
* @since 3.6.0
*/
export const getPartUtc: {
/**
* Gets one UTC part of a `DateTime` as a number.
*
* **Details**
*
* The part will be in the UTC time zone.
*
* **Example** (Reading UTC DateTime parts by key)
*
* ```ts
* import { DateTime } from "effect"
*
* const dateTime = DateTime.makeUnsafe({ year: 2024 })
* const year = DateTime.getPartUtc(dateTime, "year")
* console.log(year) // 2024
* ```
*
* @category parts
* @since 3.6.0
*/
(part: keyof DateTime.PartsWithWeekday): (self: DateTime) => number
/**
* Gets one UTC part of a `DateTime` as a number.
*
* **Details**
*
* The part will be in the UTC time zone.
*
* **Example** (Reading UTC DateTime parts by key)
*
* ```ts
* import { DateTime } from "effect"
*
* const dateTime = DateTime.makeUnsafe({ year: 2024 })
* const year = DateTime.getPartUtc(dateTime, "year")
* console.log(year) // 2024
* ```
*
* @category parts
* @since 3.6.0
*/
(self: DateTime, part: keyof DateTime.PartsWithWeekday): number
} = Internal.getPartUtc
/**
* Gets one time-zone-adjusted part of a `DateTime` as a number.
*
* **Details**
*
* The part will be time zone adjusted.
*
* **Example** (Reading DateTime parts by key)
*
* ```ts
* import { DateTime } from "effect"
*
* const dateTime = DateTime.makeZonedUnsafe({ year: 2024 }, {
* timeZone: "Europe/London"
* })
* const year = DateTime.getPart(dateTime, "year")
* console.log(year) // 2024
* ```
*
* @category parts
* @since 3.6.0
*/
export const getPart: {
/**
* Gets one time-zone-adjusted part of a `DateTime` as a number.
*
* **Details**
*
* The part will be time zone adjusted.
*
* **Example** (Reading DateTime parts by key)
*
* ```ts
* import { DateTime } from "effect"
*
* const dateTime = DateTime.makeZonedUnsafe({ year: 2024 }, {
* timeZone: "Europe/London"
* })
* const year = DateTime.getPart(dateTime, "year")
* console.log(year) // 2024
* ```
*
* @category parts
* @since 3.6.0
*/
(part: keyof DateTime.PartsWithWeekday): (self: DateTime) => number
/**
* Gets one time-zone-adjusted part of a `DateTime` as a number.
*
* **Details**
*
* The part will be time zone adjusted.
*
* **Example** (Reading DateTime parts by key)
*
* ```ts
* import { DateTime } from "effect"
*
* const dateTime = DateTime.makeZonedUnsafe({ year: 2024 }, {
* timeZone: "Europe/London"
* })
* const year = DateTime.getPart(dateTime, "year")
* console.log(year) // 2024
* ```
*
* @category parts
* @since 3.6.0
*/
(self: DateTime, part: keyof DateTime.PartsWithWeekday): number
} = Internal.getPart
/**
* Sets time-zone-adjusted parts on a `DateTime`.
*
* **Details**
*
* The date will be time zone adjusted for `DateTime.Zoned`.
*
* **Example** (Updating DateTime parts)
*
* ```ts
* import { DateTime } from "effect"
*
* const dt = DateTime.makeUnsafe("2024-01-01T12:00:00Z")
* const updated = DateTime.setParts(dt, {
* year: 2025,
* month: 6,
* day: 15
* })
*
* console.log(DateTime.formatIso(updated)) // "2025-06-15T12:00:00.000Z"
* ```
*
* @category parts
* @since 3.6.0
*/
export const setParts: {
/**
* Sets time-zone-adjusted parts on a `DateTime`.
*
* **Details**
*
* The date will be time zone adjusted for `DateTime.Zoned`.
*
* **Example** (Updating DateTime parts)
*
* ```ts
* import { DateTime } from "effect"
*
* const dt = DateTime.makeUnsafe("2024-01-01T12:00:00Z")
* const updated = DateTime.setParts(dt, {
* year: 2025,
* month: 6,
* day: 15
* })
*
* console.log(DateTime.formatIso(updated)) // "2025-06-15T12:00:00.000Z"
* ```
*
* @category parts
* @since 3.6.0
*/
(parts: Partial<DateTime.PartsWithWeekday>): <A extends DateTime>(self: A) => A
/**
* Sets time-zone-adjusted parts on a `DateTime`.
*
* **Details**
*
* The date will be time zone adjusted for `DateTime.Zoned`.
*
* **Example** (Updating DateTime parts)
*
* ```ts
* import { DateTime } from "effect"
*
* const dt = DateTime.makeUnsafe("2024-01-01T12:00:00Z")
* const updated = DateTime.setParts(dt, {
* year: 2025,
* month: 6,
* day: 15
* })
*
* console.log(DateTime.formatIso(updated)) // "2025-06-15T12:00:00.000Z"
* ```
*
* @category parts
* @since 3.6.0
*/
<A extends DateTime>(self: A, parts: Partial<DateTime.PartsWithWeekday>): A
} = Internal.setParts
/**
* Sets UTC parts on a `DateTime`.
*
* **Details**
*
* The parts are always interpreted as UTC, ignoring any time zone information.
*
* **Example** (Updating UTC DateTime parts)
*
* ```ts
* import { DateTime } from "effect"
*
* const dt = DateTime.makeUnsafe("2024-01-01T12:00:00Z")
* const updated = DateTime.setPartsUtc(dt, {
* year: 2025,
* hour: 18
* })
*
* console.log(DateTime.formatIso(updated)) // "2025-01-01T18:00:00.000Z"
* ```
*
* @category parts
* @since 3.6.0
*/
export const setPartsUtc: {
/**
* Sets UTC parts on a `DateTime`.
*
* **Details**
*
* The parts are always interpreted as UTC, ignoring any time zone information.
*
* **Example** (Updating UTC DateTime parts)
*
* ```ts
* import { DateTime } from "effect"
*
* const dt = DateTime.makeUnsafe("2024-01-01T12:00:00Z")
* const updated = DateTime.setPartsUtc(dt, {
* year: 2025,
* hour: 18
* })
*
* console.log(DateTime.formatIso(updated)) // "2025-01-01T18:00:00.000Z"
* ```
*
* @category parts
* @since 3.6.0
*/
(parts: Partial<DateTime.PartsWithWeekday>): <A extends DateTime>(self: A) => A
/**
* Sets UTC parts on a `DateTime`.
*
* **Details**
*
* The parts are always interpreted as UTC, ignoring any time zone information.
*
* **Example** (Updating UTC DateTime parts)
*
* ```ts
* import { DateTime } from "effect"
*
* const dt = DateTime.makeUnsafe("2024-01-01T12:00:00Z")
* const updated = DateTime.setPartsUtc(dt, {
* year: 2025,
* hour: 18
* })
*
* console.log(DateTime.formatIso(updated)) // "2025-01-01T18:00:00.000Z"
* ```
*
* @category parts
* @since 3.6.0
*/
<A extends DateTime>(self: A, parts: Partial<DateTime.PartsWithWeekday>): A
} = Internal.setPartsUtc
// =============================================================================
// current time zone
// =============================================================================
/**
* Context service that supplies the ambient `TimeZone` for APIs that work in
* the current zone, such as `DateTime.setZoneCurrent` and
* `DateTime.nowInCurrentZone`.
*
* **Details**
*
* Provide it with `DateTime.withCurrentZone`, one of the `withCurrentZone*`
* helpers, or one of the `layerCurrentZone*` layers.
*
* **Example** (Accessing the current time zone service)
*
* ```ts
* import { DateTime, Effect } from "effect"
*
* const program = Effect.gen(function*() {
* // Access the current time zone service
* const zone = yield* DateTime.CurrentTimeZone
* console.log(DateTime.zoneToString(zone))
* })
*
* // Provide a time zone
* const layer = DateTime.layerCurrentZoneNamed("Europe/London")
* Effect.provide(program, layer)
* ```
*
* @category current time zone
* @since 3.11.0
*/
export class CurrentTimeZone extends Context.Service<CurrentTimeZone, TimeZone>()(
"effect/DateTime/CurrentTimeZone"
) {}
/**
* Sets the time zone of a `DateTime` to the current time zone, which is
* determined by the `CurrentTimeZone` service.
*
* **Example** (Setting the current time zone)
*
* ```ts
* import { DateTime, Effect } from "effect"
*
* Effect.gen(function*() {
* const now = yield* DateTime.now
*
* // set the time zone to "Europe/London"
* const zoned = yield* DateTime.setZoneCurrent(now)
* }).pipe(DateTime.withCurrentZoneNamed("Europe/London"))
* ```
*
* @category current time zone
* @since 3.6.0
*/
export const setZoneCurrent = (self: DateTime): Effect.Effect<Zoned, never, CurrentTimeZone> =>
Effect.map(CurrentTimeZone, (zone) => setZone(self, zone))
/**
* Provides the `CurrentTimeZone` to an effect.
*
* **Example** (Providing the current time zone)
*
* ```ts
* import { DateTime, Effect } from "effect"
*
* const zone = DateTime.zoneMakeNamedUnsafe("Europe/London")
*
* Effect.gen(function*() {
* const now = yield* DateTime.nowInCurrentZone
* }).pipe(DateTime.withCurrentZone(zone))
* ```
*
* @category current time zone
* @since 3.6.0
*/
export const withCurrentZone: {
/**
* Provides the `CurrentTimeZone` to an effect.
*
* **Example** (Providing the current time zone)
*
* ```ts
* import { DateTime, Effect } from "effect"
*
* const zone = DateTime.zoneMakeNamedUnsafe("Europe/London")
*
* Effect.gen(function*() {
* const now = yield* DateTime.nowInCurrentZone
* }).pipe(DateTime.withCurrentZone(zone))
* ```
*
* @category current time zone
* @since 3.6.0
*/
(value: TimeZone): <A, E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, E, Exclude<R, CurrentTimeZone>>
/**
* Provides the `CurrentTimeZone` to an effect.
*
* **Example** (Providing the current time zone)
*
* ```ts
* import { DateTime, Effect } from "effect"
*
* const zone = DateTime.zoneMakeNamedUnsafe("Europe/London")
*
* Effect.gen(function*() {
* const now = yield* DateTime.nowInCurrentZone
* }).pipe(DateTime.withCurrentZone(zone))
* ```
*
* @category current time zone
* @since 3.6.0
*/
<A, E, R>(self: Effect.Effect<A, E, R>, value: TimeZone): Effect.Effect<A, E, Exclude<R, CurrentTimeZone>>
} = provideService(CurrentTimeZone)
/**
* Provides the `CurrentTimeZone` to an effect, using the system's local time
* zone.
*
* **Example** (Providing the local time zone)
*
* ```ts
* import { DateTime, Effect } from "effect"
*
* Effect.gen(function*() {
* // will use the system's local time zone
* const now = yield* DateTime.nowInCurrentZone
* }).pipe(DateTime.withCurrentZoneLocal)
* ```
*
* @category current time zone
* @since 3.6.0
*/
export const withCurrentZoneLocal = <A, E, R>(
effect: Effect.Effect<A, E, R>
): Effect.Effect<A, E, Exclude<R, CurrentTimeZone>> =>
Effect.provideServiceEffect(effect, CurrentTimeZone, Effect.sync(zoneMakeLocal))
/**
* Provides the `CurrentTimeZone` to an effect, using an offset.
*
* **Example** (Providing a fixed-offset time zone)
*
* ```ts
* import { DateTime, Effect } from "effect"
*
* Effect.gen(function*() {
* const zone = yield* DateTime.CurrentTimeZone
* console.log(DateTime.zoneToString(zone)) // "+03:00"
* }).pipe(DateTime.withCurrentZoneOffset(3 * 60 * 60 * 1000))
* ```
*
* @category current time zone
* @since 3.6.0
*/
export const withCurrentZoneOffset: {
/**
* Provides the `CurrentTimeZone` to an effect, using an offset.
*
* **Example** (Providing a fixed-offset time zone)
*
* ```ts
* import { DateTime, Effect } from "effect"
*
* Effect.gen(function*() {
* const zone = yield* DateTime.CurrentTimeZone
* console.log(DateTime.zoneToString(zone)) // "+03:00"
* }).pipe(DateTime.withCurrentZoneOffset(3 * 60 * 60 * 1000))
* ```
*
* @category current time zone
* @since 3.6.0
*/
(offset: number): <A, E, R>(
effect: Effect.Effect<A, E, R>
) => Effect.Effect<A, E, Exclude<R, CurrentTimeZone>>
/**
* Provides the `CurrentTimeZone` to an effect, using an offset.
*
* **Example** (Providing a fixed-offset time zone)
*
* ```ts
* import { DateTime, Effect } from "effect"
*
* Effect.gen(function*() {
* const zone = yield* DateTime.CurrentTimeZone
* console.log(DateTime.zoneToString(zone)) // "+03:00"
* }).pipe(DateTime.withCurrentZoneOffset(3 * 60 * 60 * 1000))
* ```
*
* @category current time zone
* @since 3.6.0
*/
<A, E, R>(effect: Effect.Effect<A, E, R>, offset: number): Effect.Effect<A, E, Exclude<R, CurrentTimeZone>>
} = dual(
2,
<A, E, R>(effect: Effect.Effect<A, E, R>, offset: number): Effect.Effect<A, E, Exclude<R, CurrentTimeZone>> =>
Effect.provideService(effect, CurrentTimeZone, zoneMakeOffset(offset))
)
/**
* Provides the `CurrentTimeZone` to an effect using an IANA time zone
* identifier.
*
* **Details**
*
* If the time zone is invalid, it will fail with an `IllegalArgumentError`.
*
* **Example** (Providing a named time zone)
*
* ```ts
* import { DateTime, Effect } from "effect"
*
* Effect.gen(function*() {
* // will use the "Europe/London" time zone
* const now = yield* DateTime.nowInCurrentZone
* }).pipe(DateTime.withCurrentZoneNamed("Europe/London"))
* ```
*
* @category current time zone
* @since 3.6.0
*/
export const withCurrentZoneNamed: {
/**
* Provides the `CurrentTimeZone` to an effect using an IANA time zone
* identifier.
*
* **Details**
*
* If the time zone is invalid, it will fail with an `IllegalArgumentError`.
*
* **Example** (Providing a named time zone)
*
* ```ts
* import { DateTime, Effect } from "effect"
*
* Effect.gen(function*() {
* // will use the "Europe/London" time zone
* const now = yield* DateTime.nowInCurrentZone
* }).pipe(DateTime.withCurrentZoneNamed("Europe/London"))
* ```
*
* @category current time zone
* @since 3.6.0
*/
(zone: string): <A, E, R>(
effect: Effect.Effect<A, E, R>
) => Effect.Effect<A, E | IllegalArgumentError, Exclude<R, CurrentTimeZone>>
/**
* Provides the `CurrentTimeZone` to an effect using an IANA time zone
* identifier.
*
* **Details**
*
* If the time zone is invalid, it will fail with an `IllegalArgumentError`.
*
* **Example** (Providing a named time zone)
*
* ```ts
* import { DateTime, Effect } from "effect"
*
* Effect.gen(function*() {
* // will use the "Europe/London" time zone
* const now = yield* DateTime.nowInCurrentZone
* }).pipe(DateTime.withCurrentZoneNamed("Europe/London"))
* ```
*
* @category current time zone
* @since 3.6.0
*/
<A, E, R>(effect: Effect.Effect<A, E, R>, zone: string): Effect.Effect<A, E | IllegalArgumentError, Exclude<R, CurrentTimeZone>>
} = dual(
2,
<A, E, R>(
effect: Effect.Effect<A, E, R>,
zone: string
): Effect.Effect<A, E | IllegalArgumentError, Exclude<R, CurrentTimeZone>> =>
Effect.provideServiceEffect(effect, CurrentTimeZone, zoneMakeNamedEffect(zone))
)
/**
* Gets the current time as a `DateTime.Zoned`, using the `CurrentTimeZone`.
*
* **Example** (Getting the current time in the current zone)
*
* ```ts
* import { DateTime, Effect } from "effect"
*
* Effect.gen(function*() {
* // will use the "Europe/London" time zone
* const now = yield* DateTime.nowInCurrentZone
* }).pipe(DateTime.withCurrentZoneNamed("Europe/London"))
* ```
*
* @category current time zone
* @since 3.6.0
*/
export const nowInCurrentZone: Effect.Effect<Zoned, never, CurrentTimeZone> = Effect.flatMap(now, setZoneCurrent)
// =============================================================================
// mapping
// =============================================================================
/**
* Modifies a `DateTime` with a mutable local `Date` copy.
*
* **When to use**
*
* Use to adjust calendar fields in the `DateTime`'s own time zone with an
* existing `Date` mutation API.
*
* **Details**
*
* The `Date` will first have the time zone applied if possible, and then be
* converted back to a `DateTime` within the same time zone.
*
* Supports `disambiguation` when the new wall clock time is ambiguous.
*
* **Example** (Mutating DateTime values with Dates)
*
* ```ts
* import { DateTime } from "effect"
*
* const dt = DateTime.makeUnsafe("2024-01-01T12:00:00Z")
*
* const modified = DateTime.mutate(dt, (date) => {
* date.setHours(15) // Set to 3 PM
* date.setMinutes(30) // Set to 30 minutes
* })
*
* console.log(DateTime.formatIso(modified)) // "2024-01-01T15:30:00.000Z"
* ```
*
* @category mapping
* @since 3.6.0
*/
export const mutate: {
// =============================================================================
// mapping
// =============================================================================
/**
* Modifies a `DateTime` with a mutable local `Date` copy.
*
* **When to use**
*
* Use to adjust calendar fields in the `DateTime`'s own time zone with an
* existing `Date` mutation API.
*
* **Details**
*
* The `Date` will first have the time zone applied if possible, and then be
* converted back to a `DateTime` within the same time zone.
*
* Supports `disambiguation` when the new wall clock time is ambiguous.
*
* **Example** (Mutating DateTime values with Dates)
*
* ```ts
* import { DateTime } from "effect"
*
* const dt = DateTime.makeUnsafe("2024-01-01T12:00:00Z")
*
* const modified = DateTime.mutate(dt, (date) => {
* date.setHours(15) // Set to 3 PM
* date.setMinutes(30) // Set to 30 minutes
* })
*
* console.log(DateTime.formatIso(modified)) // "2024-01-01T15:30:00.000Z"
* ```
*
* @category mapping
* @since 3.6.0
*/
(
f: (date: Date) => void,
options?: {
readonly disambiguation?: Disambiguation | undefined
}
): <A extends DateTime>(self: A) => A
// =============================================================================
// mapping
// =============================================================================
/**
* Modifies a `DateTime` with a mutable local `Date` copy.
*
* **When to use**
*
* Use to adjust calendar fields in the `DateTime`'s own time zone with an
* existing `Date` mutation API.
*
* **Details**
*
* The `Date` will first have the time zone applied if possible, and then be
* converted back to a `DateTime` within the same time zone.
*
* Supports `disambiguation` when the new wall clock time is ambiguous.
*
* **Example** (Mutating DateTime values with Dates)
*
* ```ts
* import { DateTime } from "effect"
*
* const dt = DateTime.makeUnsafe("2024-01-01T12:00:00Z")
*
* const modified = DateTime.mutate(dt, (date) => {
* date.setHours(15) // Set to 3 PM
* date.setMinutes(30) // Set to 30 minutes
* })
*
* console.log(DateTime.formatIso(modified)) // "2024-01-01T15:30:00.000Z"
* ```
*
* @category mapping
* @since 3.6.0
*/
<A extends DateTime>(
self: A,
f: (date: Date) => void,
options?: {
readonly disambiguation?: Disambiguation | undefined
}
): A
} = Internal.mutate
/**
* Modifies a `DateTime` with a mutable UTC `Date` copy.
*
* **When to use**
*
* Use to adjust the instant with an existing `Date` mutation API that works on
* UTC calendar fields.
*
* **Example** (Mutating DateTime values with UTC Dates)
*
* ```ts
* import { DateTime } from "effect"
*
* const dt = DateTime.makeZonedUnsafe("2024-01-01T12:00:00Z", {
* timeZone: "Europe/London"
* })
*
* const modified = DateTime.mutateUtc(dt, (date) => {
* date.setUTCHours(18) // Set UTC time to 6 PM
* })
*
* console.log(DateTime.formatIso(modified)) // "2024-01-01T18:00:00.000Z"
* ```
*
* @category mapping
* @since 3.6.0
*/
export const mutateUtc: {
/**
* Modifies a `DateTime` with a mutable UTC `Date` copy.
*
* **When to use**
*
* Use to adjust the instant with an existing `Date` mutation API that works on
* UTC calendar fields.
*
* **Example** (Mutating DateTime values with UTC Dates)
*
* ```ts
* import { DateTime } from "effect"
*
* const dt = DateTime.makeZonedUnsafe("2024-01-01T12:00:00Z", {
* timeZone: "Europe/London"
* })
*
* const modified = DateTime.mutateUtc(dt, (date) => {
* date.setUTCHours(18) // Set UTC time to 6 PM
* })
*
* console.log(DateTime.formatIso(modified)) // "2024-01-01T18:00:00.000Z"
* ```
*
* @category mapping
* @since 3.6.0
*/
(f: (date: Date) => void): <A extends DateTime>(self: A) => A
/**
* Modifies a `DateTime` with a mutable UTC `Date` copy.
*
* **When to use**
*
* Use to adjust the instant with an existing `Date` mutation API that works on
* UTC calendar fields.
*
* **Example** (Mutating DateTime values with UTC Dates)
*
* ```ts
* import { DateTime } from "effect"
*
* const dt = DateTime.makeZonedUnsafe("2024-01-01T12:00:00Z", {
* timeZone: "Europe/London"
* })
*
* const modified = DateTime.mutateUtc(dt, (date) => {
* date.setUTCHours(18) // Set UTC time to 6 PM
* })
*
* console.log(DateTime.formatIso(modified)) // "2024-01-01T18:00:00.000Z"
* ```
*
* @category mapping
* @since 3.6.0
*/
<A extends DateTime>(self: A, f: (date: Date) => void): A
} = Internal.mutateUtc
/**
* Transforms a `DateTime` by applying a function to the number of milliseconds
* since the Unix epoch.
*
* **Example** (Mapping epoch milliseconds)
*
* ```ts
* import { DateTime } from "effect"
*
* // add 10 milliseconds
* DateTime.makeUnsafe(0).pipe(
* DateTime.mapEpochMillis((millis) => millis + 10)
* )
* ```
*
* @category mapping
* @since 3.6.0
*/
export const mapEpochMillis: {
/**
* Transforms a `DateTime` by applying a function to the number of milliseconds
* since the Unix epoch.
*
* **Example** (Mapping epoch milliseconds)
*
* ```ts
* import { DateTime } from "effect"
*
* // add 10 milliseconds
* DateTime.makeUnsafe(0).pipe(
* DateTime.mapEpochMillis((millis) => millis + 10)
* )
* ```
*
* @category mapping
* @since 3.6.0
*/
(f: (millis: number) => number): <A extends DateTime>(self: A) => A
/**
* Transforms a `DateTime` by applying a function to the number of milliseconds
* since the Unix epoch.
*
* **Example** (Mapping epoch milliseconds)
*
* ```ts
* import { DateTime } from "effect"
*
* // add 10 milliseconds
* DateTime.makeUnsafe(0).pipe(
* DateTime.mapEpochMillis((millis) => millis + 10)
* )
* ```
*
* @category mapping
* @since 3.6.0
*/
<A extends DateTime>(self: A, f: (millis: number) => number): A
} = Internal.mapEpochMillis
/**
* Applies a function to a JavaScript `Date` representing the `DateTime` and
* returns the function's result.
*
* **Details**
*
* The callback receives the time-zone-adjusted wall-clock date for
* `DateTime.Zoned` values. Use `DateTime.withDateUtc` when the callback should
* receive the UTC instant.
*
* **Example** (Using time zone adjusted Dates)
*
* ```ts
* import { DateTime } from "effect"
*
* // get the time zone adjusted date in milliseconds
* DateTime.makeZonedUnsafe(0, { timeZone: "Europe/London" }).pipe(
* DateTime.withDate((date) => date.getTime())
* )
* ```
*
* @category mapping
* @since 3.6.0
*/
export const withDate: {
/**
* Applies a function to a JavaScript `Date` representing the `DateTime` and
* returns the function's result.
*
* **Details**
*
* The callback receives the time-zone-adjusted wall-clock date for
* `DateTime.Zoned` values. Use `DateTime.withDateUtc` when the callback should
* receive the UTC instant.
*
* **Example** (Using time zone adjusted Dates)
*
* ```ts
* import { DateTime } from "effect"
*
* // get the time zone adjusted date in milliseconds
* DateTime.makeZonedUnsafe(0, { timeZone: "Europe/London" }).pipe(
* DateTime.withDate((date) => date.getTime())
* )
* ```
*
* @category mapping
* @since 3.6.0
*/
<A>(f: (date: Date) => A): (self: DateTime) => A
/**
* Applies a function to a JavaScript `Date` representing the `DateTime` and
* returns the function's result.
*
* **Details**
*
* The callback receives the time-zone-adjusted wall-clock date for
* `DateTime.Zoned` values. Use `DateTime.withDateUtc` when the callback should
* receive the UTC instant.
*
* **Example** (Using time zone adjusted Dates)
*
* ```ts
* import { DateTime } from "effect"
*
* // get the time zone adjusted date in milliseconds
* DateTime.makeZonedUnsafe(0, { timeZone: "Europe/London" }).pipe(
* DateTime.withDate((date) => date.getTime())
* )
* ```
*
* @category mapping
* @since 3.6.0
*/
<A>(self: DateTime, f: (date: Date) => A): A
} = Internal.withDate
/**
* Applies a function to a JavaScript `Date` representing the `DateTime`'s UTC
* instant and returns the function's result.
*
* **Details**
*
* This ignores any associated time zone. Use `DateTime.withDate` when the
* callback should receive the time-zone-adjusted wall-clock date.
*
* **Example** (Using UTC Dates)
*
* ```ts
* import { DateTime } from "effect"
*
* // get the date in milliseconds
* DateTime.makeUnsafe(0).pipe(
* DateTime.withDateUtc((date) => date.getTime())
* )
* ```
*
* @category mapping
* @since 3.6.0
*/
export const withDateUtc: {
/**
* Applies a function to a JavaScript `Date` representing the `DateTime`'s UTC
* instant and returns the function's result.
*
* **Details**
*
* This ignores any associated time zone. Use `DateTime.withDate` when the
* callback should receive the time-zone-adjusted wall-clock date.
*
* **Example** (Using UTC Dates)
*
* ```ts
* import { DateTime } from "effect"
*
* // get the date in milliseconds
* DateTime.makeUnsafe(0).pipe(
* DateTime.withDateUtc((date) => date.getTime())
* )
* ```
*
* @category mapping
* @since 3.6.0
*/
<A>(f: (date: Date) => A): (self: DateTime) => A
/**
* Applies a function to a JavaScript `Date` representing the `DateTime`'s UTC
* instant and returns the function's result.
*
* **Details**
*
* This ignores any associated time zone. Use `DateTime.withDate` when the
* callback should receive the time-zone-adjusted wall-clock date.
*
* **Example** (Using UTC Dates)
*
* ```ts
* import { DateTime } from "effect"
*
* // get the date in milliseconds
* DateTime.makeUnsafe(0).pipe(
* DateTime.withDateUtc((date) => date.getTime())
* )
* ```
*
* @category mapping
* @since 3.6.0
*/
<A>(self: DateTime, f: (date: Date) => A): A
} = Internal.withDateUtc
/**
* Pattern match on a `DateTime` to handle `Utc` and `Zoned` cases differently.
*
* **Example** (Pattern matching DateTime variants)
*
* ```ts
* import { DateTime } from "effect"
*
* const dt1 = DateTime.makeUnsafe("2024-01-01T12:00:00Z") // Utc
* const dt2 = DateTime.makeZonedUnsafe("2024-06-15T14:30:00Z", {
* timeZone: "Europe/London"
* }) // Zoned
*
* const result1 = DateTime.match(dt1, {
* onUtc: (utc) => `UTC: ${DateTime.formatIso(utc)}`,
* onZoned: (zoned) => `Zoned: ${DateTime.formatIsoZoned(zoned)}`
* })
*
* const result2 = DateTime.match(dt2, {
* onUtc: (utc) => `UTC: ${DateTime.formatIso(utc)}`,
* onZoned: (zoned) => `Zoned: ${DateTime.formatIsoZoned(zoned)}`
* })
*
* console.log(result1) // "UTC: 2024-01-01T12:00:00.000Z"
* console.log(result2) // "Zoned: 2024-06-15T15:30:00.000+01:00[Europe/London]"
* ```
*
* @category mapping
* @since 3.6.0
*/
export const match: {
/**
* Pattern match on a `DateTime` to handle `Utc` and `Zoned` cases differently.
*
* **Example** (Pattern matching DateTime variants)
*
* ```ts
* import { DateTime } from "effect"
*
* const dt1 = DateTime.makeUnsafe("2024-01-01T12:00:00Z") // Utc
* const dt2 = DateTime.makeZonedUnsafe("2024-06-15T14:30:00Z", {
* timeZone: "Europe/London"
* }) // Zoned
*
* const result1 = DateTime.match(dt1, {
* onUtc: (utc) => `UTC: ${DateTime.formatIso(utc)}`,
* onZoned: (zoned) => `Zoned: ${DateTime.formatIsoZoned(zoned)}`
* })
*
* const result2 = DateTime.match(dt2, {
* onUtc: (utc) => `UTC: ${DateTime.formatIso(utc)}`,
* onZoned: (zoned) => `Zoned: ${DateTime.formatIsoZoned(zoned)}`
* })
*
* console.log(result1) // "UTC: 2024-01-01T12:00:00.000Z"
* console.log(result2) // "Zoned: 2024-06-15T15:30:00.000+01:00[Europe/London]"
* ```
*
* @category mapping
* @since 3.6.0
*/
<A, B>(
options: {
readonly onUtc: (_: Utc) => A
readonly onZoned: (_: Zoned) => B
}
): (self: DateTime) => A | B
/**
* Pattern match on a `DateTime` to handle `Utc` and `Zoned` cases differently.
*
* **Example** (Pattern matching DateTime variants)
*
* ```ts
* import { DateTime } from "effect"
*
* const dt1 = DateTime.makeUnsafe("2024-01-01T12:00:00Z") // Utc
* const dt2 = DateTime.makeZonedUnsafe("2024-06-15T14:30:00Z", {
* timeZone: "Europe/London"
* }) // Zoned
*
* const result1 = DateTime.match(dt1, {
* onUtc: (utc) => `UTC: ${DateTime.formatIso(utc)}`,
* onZoned: (zoned) => `Zoned: ${DateTime.formatIsoZoned(zoned)}`
* })
*
* const result2 = DateTime.match(dt2, {
* onUtc: (utc) => `UTC: ${DateTime.formatIso(utc)}`,
* onZoned: (zoned) => `Zoned: ${DateTime.formatIsoZoned(zoned)}`
* })
*
* console.log(result1) // "UTC: 2024-01-01T12:00:00.000Z"
* console.log(result2) // "Zoned: 2024-06-15T15:30:00.000+01:00[Europe/London]"
* ```
*
* @category mapping
* @since 3.6.0
*/
<A, B>(
self: DateTime,
options: {
readonly onUtc: (_: Utc) => A
readonly onZoned: (_: Zoned) => B
}
): A | B
} = Internal.match
// =============================================================================
// math
// =============================================================================
/**
* Adds the given `Duration` to a `DateTime`.
*
* **When to use**
*
* Use to move a `DateTime` by an elapsed duration such as minutes, seconds, or
* milliseconds.
*
* **Details**
*
* The duration is converted to milliseconds and added to the epoch
* milliseconds. Zoned values keep their original time zone.
*
* **Gotchas**
*
* This is elapsed-time arithmetic, not calendar-aware local date arithmetic.
* Use `add` when adding days, weeks, months, or years should account for the
* date/time zone rules.
*
* **Example** (Adding durations)
*
* ```ts
* import { DateTime } from "effect"
*
* // add 5 minutes
* DateTime.makeUnsafe(0).pipe(
* DateTime.addDuration("5 minutes")
* )
* ```
*
* @see {@link add} for calendar-aware date/time part arithmetic
* @see {@link subtractDuration} for subtracting an elapsed duration
*
* @category math
* @since 3.6.0
*/
export const addDuration: {
// =============================================================================
// math
// =============================================================================
/**
* Adds the given `Duration` to a `DateTime`.
*
* **When to use**
*
* Use to move a `DateTime` by an elapsed duration such as minutes, seconds, or
* milliseconds.
*
* **Details**
*
* The duration is converted to milliseconds and added to the epoch
* milliseconds. Zoned values keep their original time zone.
*
* **Gotchas**
*
* This is elapsed-time arithmetic, not calendar-aware local date arithmetic.
* Use `add` when adding days, weeks, months, or years should account for the
* date/time zone rules.
*
* **Example** (Adding durations)
*
* ```ts
* import { DateTime } from "effect"
*
* // add 5 minutes
* DateTime.makeUnsafe(0).pipe(
* DateTime.addDuration("5 minutes")
* )
* ```
*
* @see {@link add} for calendar-aware date/time part arithmetic
* @see {@link subtractDuration} for subtracting an elapsed duration
*
* @category math
* @since 3.6.0
*/
(duration: Duration.Input): <A extends DateTime>(self: A) => A
// =============================================================================
// math
// =============================================================================
/**
* Adds the given `Duration` to a `DateTime`.
*
* **When to use**
*
* Use to move a `DateTime` by an elapsed duration such as minutes, seconds, or
* milliseconds.
*
* **Details**
*
* The duration is converted to milliseconds and added to the epoch
* milliseconds. Zoned values keep their original time zone.
*
* **Gotchas**
*
* This is elapsed-time arithmetic, not calendar-aware local date arithmetic.
* Use `add` when adding days, weeks, months, or years should account for the
* date/time zone rules.
*
* **Example** (Adding durations)
*
* ```ts
* import { DateTime } from "effect"
*
* // add 5 minutes
* DateTime.makeUnsafe(0).pipe(
* DateTime.addDuration("5 minutes")
* )
* ```
*
* @see {@link add} for calendar-aware date/time part arithmetic
* @see {@link subtractDuration} for subtracting an elapsed duration
*
* @category math
* @since 3.6.0
*/
<A extends DateTime>(self: A, duration: Duration.Input): A
} = Internal.addDuration
/**
* Subtracts the given `Duration` from a `DateTime`.
*
* **Example** (Subtracting durations)
*
* ```ts
* import { DateTime } from "effect"
*
* // subtract 5 minutes
* DateTime.makeUnsafe(0).pipe(
* DateTime.subtractDuration("5 minutes")
* )
* ```
*
* @category math
* @since 3.6.0
*/
export const subtractDuration: {
/**
* Subtracts the given `Duration` from a `DateTime`.
*
* **Example** (Subtracting durations)
*
* ```ts
* import { DateTime } from "effect"
*
* // subtract 5 minutes
* DateTime.makeUnsafe(0).pipe(
* DateTime.subtractDuration("5 minutes")
* )
* ```
*
* @category math
* @since 3.6.0
*/
(duration: Duration.Input): <A extends DateTime>(self: A) => A
/**
* Subtracts the given `Duration` from a `DateTime`.
*
* **Example** (Subtracting durations)
*
* ```ts
* import { DateTime } from "effect"
*
* // subtract 5 minutes
* DateTime.makeUnsafe(0).pipe(
* DateTime.subtractDuration("5 minutes")
* )
* ```
*
* @category math
* @since 3.6.0
*/
<A extends DateTime>(self: A, duration: Duration.Input): A
} = Internal.subtractDuration
/**
* Adds the given `amount` of `unit` to a `DateTime`.
*
* **Details**
*
* The time zone is taken into account when adding days, weeks, months, and
* years.
*
* **Example** (Adding date and time parts)
*
* ```ts
* import { DateTime } from "effect"
*
* // add 5 minutes
* DateTime.makeUnsafe(0).pipe(
* DateTime.add({ minutes: 5 })
* )
* ```
*
* @category math
* @since 3.6.0
*/
export const add: {
/**
* Adds the given `amount` of `unit` to a `DateTime`.
*
* **Details**
*
* The time zone is taken into account when adding days, weeks, months, and
* years.
*
* **Example** (Adding date and time parts)
*
* ```ts
* import { DateTime } from "effect"
*
* // add 5 minutes
* DateTime.makeUnsafe(0).pipe(
* DateTime.add({ minutes: 5 })
* )
* ```
*
* @category math
* @since 3.6.0
*/
(parts: Partial<DateTime.PartsForMath>): <A extends DateTime>(self: A) => A
/**
* Adds the given `amount` of `unit` to a `DateTime`.
*
* **Details**
*
* The time zone is taken into account when adding days, weeks, months, and
* years.
*
* **Example** (Adding date and time parts)
*
* ```ts
* import { DateTime } from "effect"
*
* // add 5 minutes
* DateTime.makeUnsafe(0).pipe(
* DateTime.add({ minutes: 5 })
* )
* ```
*
* @category math
* @since 3.6.0
*/
<A extends DateTime>(self: A, parts: Partial<DateTime.PartsForMath>): A
} = Internal.add
/**
* Subtracts the given `amount` of `unit` from a `DateTime`.
*
* **Example** (Subtracting date and time parts)
*
* ```ts
* import { DateTime } from "effect"
*
* // subtract 5 minutes
* DateTime.makeUnsafe(0).pipe(
* DateTime.subtract({ minutes: 5 })
* )
* ```
*
* @category math
* @since 3.6.0
*/
export const subtract: {
/**
* Subtracts the given `amount` of `unit` from a `DateTime`.
*
* **Example** (Subtracting date and time parts)
*
* ```ts
* import { DateTime } from "effect"
*
* // subtract 5 minutes
* DateTime.makeUnsafe(0).pipe(
* DateTime.subtract({ minutes: 5 })
* )
* ```
*
* @category math
* @since 3.6.0
*/
(parts: Partial<DateTime.PartsForMath>): <A extends DateTime>(self: A) => A
/**
* Subtracts the given `amount` of `unit` from a `DateTime`.
*
* **Example** (Subtracting date and time parts)
*
* ```ts
* import { DateTime } from "effect"
*
* // subtract 5 minutes
* DateTime.makeUnsafe(0).pipe(
* DateTime.subtract({ minutes: 5 })
* )
* ```
*
* @category math
* @since 3.6.0
*/
<A extends DateTime>(self: A, parts: Partial<DateTime.PartsForMath>): A
} = Internal.subtract
/**
* Converts a `DateTime` to the start of the given `part`.
*
* **Details**
*
* If the part is `week`, the `weekStartsOn` option can be used to specify the
* day of the week that the week starts on. The default is 0 (Sunday).
*
* **Example** (Rounding down DateTime values)
*
* ```ts
* import { DateTime } from "effect"
*
* // returns "2024-01-01T00:00:00Z"
* DateTime.makeUnsafe("2024-01-01T12:00:00Z").pipe(
* DateTime.startOf("day"),
* DateTime.formatIso
* )
* ```
*
* @category math
* @since 3.6.0
*/
export const startOf: {
/**
* Converts a `DateTime` to the start of the given `part`.
*
* **Details**
*
* If the part is `week`, the `weekStartsOn` option can be used to specify the
* day of the week that the week starts on. The default is 0 (Sunday).
*
* **Example** (Rounding down DateTime values)
*
* ```ts
* import { DateTime } from "effect"
*
* // returns "2024-01-01T00:00:00Z"
* DateTime.makeUnsafe("2024-01-01T12:00:00Z").pipe(
* DateTime.startOf("day"),
* DateTime.formatIso
* )
* ```
*
* @category math
* @since 3.6.0
*/
(
part: DateTime.UnitSingular,
options?: { readonly weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | undefined }
): <A extends DateTime>(self: A) => A
/**
* Converts a `DateTime` to the start of the given `part`.
*
* **Details**
*
* If the part is `week`, the `weekStartsOn` option can be used to specify the
* day of the week that the week starts on. The default is 0 (Sunday).
*
* **Example** (Rounding down DateTime values)
*
* ```ts
* import { DateTime } from "effect"
*
* // returns "2024-01-01T00:00:00Z"
* DateTime.makeUnsafe("2024-01-01T12:00:00Z").pipe(
* DateTime.startOf("day"),
* DateTime.formatIso
* )
* ```
*
* @category math
* @since 3.6.0
*/
<A extends DateTime>(
self: A,
part: DateTime.UnitSingular,
options?: { readonly weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | undefined }
): A
} = Internal.startOf
/**
* Converts a `DateTime` to the end of the given `part`.
*
* **Details**
*
* If the part is `week`, the `weekStartsOn` option can be used to specify the
* day of the week that the week starts on. The default is 0 (Sunday).
*
* **Example** (Rounding up DateTime values)
*
* ```ts
* import { DateTime } from "effect"
*
* // returns "2024-01-01T23:59:59.999Z"
* DateTime.makeUnsafe("2024-01-01T12:00:00Z").pipe(
* DateTime.endOf("day"),
* DateTime.formatIso
* )
* ```
*
* @category math
* @since 3.6.0
*/
export const endOf: {
/**
* Converts a `DateTime` to the end of the given `part`.
*
* **Details**
*
* If the part is `week`, the `weekStartsOn` option can be used to specify the
* day of the week that the week starts on. The default is 0 (Sunday).
*
* **Example** (Rounding up DateTime values)
*
* ```ts
* import { DateTime } from "effect"
*
* // returns "2024-01-01T23:59:59.999Z"
* DateTime.makeUnsafe("2024-01-01T12:00:00Z").pipe(
* DateTime.endOf("day"),
* DateTime.formatIso
* )
* ```
*
* @category math
* @since 3.6.0
*/
(
part: DateTime.UnitSingular,
options?: { readonly weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | undefined }
): <A extends DateTime>(self: A) => A
/**
* Converts a `DateTime` to the end of the given `part`.
*
* **Details**
*
* If the part is `week`, the `weekStartsOn` option can be used to specify the
* day of the week that the week starts on. The default is 0 (Sunday).
*
* **Example** (Rounding up DateTime values)
*
* ```ts
* import { DateTime } from "effect"
*
* // returns "2024-01-01T23:59:59.999Z"
* DateTime.makeUnsafe("2024-01-01T12:00:00Z").pipe(
* DateTime.endOf("day"),
* DateTime.formatIso
* )
* ```
*
* @category math
* @since 3.6.0
*/
<A extends DateTime>(
self: A,
part: DateTime.UnitSingular,
options?: { readonly weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | undefined }
): A
} = Internal.endOf
/**
* Converts a `DateTime` to the nearest given `part`.
*
* **Details**
*
* If the part is `week`, the `weekStartsOn` option can be used to specify the
* day of the week that the week starts on. The default is 0 (Sunday).
*
* **Example** (Rounding DateTime values to nearest units)
*
* ```ts
* import { DateTime } from "effect"
*
* // returns "2024-01-02T00:00:00Z"
* DateTime.makeUnsafe("2024-01-01T12:01:00Z").pipe(
* DateTime.nearest("day"),
* DateTime.formatIso
* )
* ```
*
* @category math
* @since 3.6.0
*/
export const nearest: {
/**
* Converts a `DateTime` to the nearest given `part`.
*
* **Details**
*
* If the part is `week`, the `weekStartsOn` option can be used to specify the
* day of the week that the week starts on. The default is 0 (Sunday).
*
* **Example** (Rounding DateTime values to nearest units)
*
* ```ts
* import { DateTime } from "effect"
*
* // returns "2024-01-02T00:00:00Z"
* DateTime.makeUnsafe("2024-01-01T12:01:00Z").pipe(
* DateTime.nearest("day"),
* DateTime.formatIso
* )
* ```
*
* @category math
* @since 3.6.0
*/
(
part: DateTime.UnitSingular,
options?: { readonly weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | undefined }
): <A extends DateTime>(self: A) => A
/**
* Converts a `DateTime` to the nearest given `part`.
*
* **Details**
*
* If the part is `week`, the `weekStartsOn` option can be used to specify the
* day of the week that the week starts on. The default is 0 (Sunday).
*
* **Example** (Rounding DateTime values to nearest units)
*
* ```ts
* import { DateTime } from "effect"
*
* // returns "2024-01-02T00:00:00Z"
* DateTime.makeUnsafe("2024-01-01T12:01:00Z").pipe(
* DateTime.nearest("day"),
* DateTime.formatIso
* )
* ```
*
* @category math
* @since 3.6.0
*/
<A extends DateTime>(
self: A,
part: DateTime.UnitSingular,
options?: { readonly weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | undefined }
): A
} = Internal.nearest
// =============================================================================
// formatting
// =============================================================================
/**
* Formats a `DateTime` with `Intl.DateTimeFormat`.
*
* **Details**
*
* Unless a `timeZone` option is supplied, UTC values are formatted in UTC and
* zoned values are formatted in their named zone or fixed-offset zone.
*
* Fixed-offset zones depend on runtime support for offset `timeZone`
* identifiers. When unsupported, formatting falls back to UTC with the
* `DateTime` adjusted to the offset.
*
* **Example** (Formatting DateTime values with Intl options)
*
* ```ts
* import { DateTime } from "effect"
*
* const dt = DateTime.makeZonedUnsafe("2024-06-15T14:30:00Z", {
* timeZone: "Europe/London"
* })
*
* const formatted = DateTime.format(dt, {
* dateStyle: "full",
* timeStyle: "short",
* locale: "en-US"
* })
*
* console.log(formatted) // "Saturday, June 15, 2024 at 3:30 PM"
* ```
*
* @category formatting
* @since 3.6.0
*/
export const format: {
// =============================================================================
// formatting
// =============================================================================
/**
* Formats a `DateTime` with `Intl.DateTimeFormat`.
*
* **Details**
*
* Unless a `timeZone` option is supplied, UTC values are formatted in UTC and
* zoned values are formatted in their named zone or fixed-offset zone.
*
* Fixed-offset zones depend on runtime support for offset `timeZone`
* identifiers. When unsupported, formatting falls back to UTC with the
* `DateTime` adjusted to the offset.
*
* **Example** (Formatting DateTime values with Intl options)
*
* ```ts
* import { DateTime } from "effect"
*
* const dt = DateTime.makeZonedUnsafe("2024-06-15T14:30:00Z", {
* timeZone: "Europe/London"
* })
*
* const formatted = DateTime.format(dt, {
* dateStyle: "full",
* timeStyle: "short",
* locale: "en-US"
* })
*
* console.log(formatted) // "Saturday, June 15, 2024 at 3:30 PM"
* ```
*
* @category formatting
* @since 3.6.0
*/
(
options?:
| Intl.DateTimeFormatOptions & {
readonly locale?: string | undefined
}
| undefined
): (self: DateTime) => string
// =============================================================================
// formatting
// =============================================================================
/**
* Formats a `DateTime` with `Intl.DateTimeFormat`.
*
* **Details**
*
* Unless a `timeZone` option is supplied, UTC values are formatted in UTC and
* zoned values are formatted in their named zone or fixed-offset zone.
*
* Fixed-offset zones depend on runtime support for offset `timeZone`
* identifiers. When unsupported, formatting falls back to UTC with the
* `DateTime` adjusted to the offset.
*
* **Example** (Formatting DateTime values with Intl options)
*
* ```ts
* import { DateTime } from "effect"
*
* const dt = DateTime.makeZonedUnsafe("2024-06-15T14:30:00Z", {
* timeZone: "Europe/London"
* })
*
* const formatted = DateTime.format(dt, {
* dateStyle: "full",
* timeStyle: "short",
* locale: "en-US"
* })
*
* console.log(formatted) // "Saturday, June 15, 2024 at 3:30 PM"
* ```
*
* @category formatting
* @since 3.6.0
*/
(
self: DateTime,
options?:
| Intl.DateTimeFormatOptions & {
readonly locale?: string | undefined
}
| undefined
): string
} = Internal.format
/**
* Formats a `DateTime` with `Intl.DateTimeFormat` using the system local time
* zone and locale.
*
* **Example** (Formatting DateTime values locally)
*
* ```ts
* import { DateTime } from "effect"
*
* const dt = DateTime.makeUnsafe("2024-06-15T14:30:00Z")
*
* // Uses system local time zone and locale
* const local = DateTime.formatLocal(dt, {
* year: "numeric",
* month: "long",
* day: "numeric",
* hour: "2-digit",
* minute: "2-digit"
* })
*
* console.log(local) // Output depends on system locale/timezone
* ```
*
* @category formatting
* @since 3.6.0
*/
export const formatLocal: {
/**
* Formats a `DateTime` with `Intl.DateTimeFormat` using the system local time
* zone and locale.
*
* **Example** (Formatting DateTime values locally)
*
* ```ts
* import { DateTime } from "effect"
*
* const dt = DateTime.makeUnsafe("2024-06-15T14:30:00Z")
*
* // Uses system local time zone and locale
* const local = DateTime.formatLocal(dt, {
* year: "numeric",
* month: "long",
* day: "numeric",
* hour: "2-digit",
* minute: "2-digit"
* })
*
* console.log(local) // Output depends on system locale/timezone
* ```
*
* @category formatting
* @since 3.6.0
*/
(
options?:
| Intl.DateTimeFormatOptions & {
readonly locale?: string | undefined
}
| undefined
): (self: DateTime) => string
/**
* Formats a `DateTime` with `Intl.DateTimeFormat` using the system local time
* zone and locale.
*
* **Example** (Formatting DateTime values locally)
*
* ```ts
* import { DateTime } from "effect"
*
* const dt = DateTime.makeUnsafe("2024-06-15T14:30:00Z")
*
* // Uses system local time zone and locale
* const local = DateTime.formatLocal(dt, {
* year: "numeric",
* month: "long",
* day: "numeric",
* hour: "2-digit",
* minute: "2-digit"
* })
*
* console.log(local) // Output depends on system locale/timezone
* ```
*
* @category formatting
* @since 3.6.0
*/
(
self: DateTime,
options?:
| Intl.DateTimeFormatOptions & {
readonly locale?: string | undefined
}
| undefined
): string
} = Internal.formatLocal
/**
* Formats a `DateTime` with `Intl.DateTimeFormat` using the UTC time zone.
*
* **Details**
*
* This forces the time zone to be UTC.
*
* **Example** (Formatting DateTime values in UTC)
*
* ```ts
* import { DateTime } from "effect"
*
* const dt = DateTime.makeZonedUnsafe("2024-06-15T14:30:00Z", {
* timeZone: "Europe/London"
* })
*
* // Force UTC formatting regardless of time zone
* const utcFormatted = DateTime.formatUtc(dt, {
* year: "numeric",
* month: "2-digit",
* day: "2-digit",
* hour: "2-digit",
* minute: "2-digit",
* timeZoneName: "short"
* })
*
* console.log(utcFormatted) // "06/15/2024, 02:30 PM UTC"
* ```
*
* @category formatting
* @since 3.6.0
*/
export const formatUtc: {
/**
* Formats a `DateTime` with `Intl.DateTimeFormat` using the UTC time zone.
*
* **Details**
*
* This forces the time zone to be UTC.
*
* **Example** (Formatting DateTime values in UTC)
*
* ```ts
* import { DateTime } from "effect"
*
* const dt = DateTime.makeZonedUnsafe("2024-06-15T14:30:00Z", {
* timeZone: "Europe/London"
* })
*
* // Force UTC formatting regardless of time zone
* const utcFormatted = DateTime.formatUtc(dt, {
* year: "numeric",
* month: "2-digit",
* day: "2-digit",
* hour: "2-digit",
* minute: "2-digit",
* timeZoneName: "short"
* })
*
* console.log(utcFormatted) // "06/15/2024, 02:30 PM UTC"
* ```
*
* @category formatting
* @since 3.6.0
*/
(
options?:
| Intl.DateTimeFormatOptions & {
readonly locale?: string | undefined
}
| undefined
): (self: DateTime) => string
/**
* Formats a `DateTime` with `Intl.DateTimeFormat` using the UTC time zone.
*
* **Details**
*
* This forces the time zone to be UTC.
*
* **Example** (Formatting DateTime values in UTC)
*
* ```ts
* import { DateTime } from "effect"
*
* const dt = DateTime.makeZonedUnsafe("2024-06-15T14:30:00Z", {
* timeZone: "Europe/London"
* })
*
* // Force UTC formatting regardless of time zone
* const utcFormatted = DateTime.formatUtc(dt, {
* year: "numeric",
* month: "2-digit",
* day: "2-digit",
* hour: "2-digit",
* minute: "2-digit",
* timeZoneName: "short"
* })
*
* console.log(utcFormatted) // "06/15/2024, 02:30 PM UTC"
* ```
*
* @category formatting
* @since 3.6.0
*/
(
self: DateTime,
options?:
| Intl.DateTimeFormatOptions & {
readonly locale?: string | undefined
}
| undefined
): string
} = Internal.formatUtc
/**
* Formats a `DateTime` as a string using the `Intl.DateTimeFormat` API.
*
* **When to use**
*
* Use when you already have an `Intl.DateTimeFormat` and want it to control the
* locale, time zone, and formatting options.
*
* **Details**
*
* The formatter receives the `DateTime` epoch milliseconds. Any time zone
* conversion comes from the supplied formatter.
*
* **Example** (Formatting DateTime values with custom formatters)
*
* ```ts
* import { DateTime } from "effect"
*
* const dt = DateTime.makeUnsafe("2024-06-15T14:30:00Z")
*
* // Create a custom formatter
* const formatter = new Intl.DateTimeFormat("de-DE", {
* year: "numeric",
* month: "long",
* day: "numeric",
* hour: "2-digit",
* minute: "2-digit",
* timeZone: "Europe/Berlin"
* })
*
* const formatted = DateTime.formatIntl(dt, formatter)
* console.log(formatted.length > 0) // true
* ```
*
* @see {@link formatUtc} for formatting with options forced to UTC
* @see {@link formatIso} for stable ISO formatting
*
* @category formatting
* @since 3.6.0
*/
export const formatIntl: {
/**
* Formats a `DateTime` as a string using the `Intl.DateTimeFormat` API.
*
* **When to use**
*
* Use when you already have an `Intl.DateTimeFormat` and want it to control the
* locale, time zone, and formatting options.
*
* **Details**
*
* The formatter receives the `DateTime` epoch milliseconds. Any time zone
* conversion comes from the supplied formatter.
*
* **Example** (Formatting DateTime values with custom formatters)
*
* ```ts
* import { DateTime } from "effect"
*
* const dt = DateTime.makeUnsafe("2024-06-15T14:30:00Z")
*
* // Create a custom formatter
* const formatter = new Intl.DateTimeFormat("de-DE", {
* year: "numeric",
* month: "long",
* day: "numeric",
* hour: "2-digit",
* minute: "2-digit",
* timeZone: "Europe/Berlin"
* })
*
* const formatted = DateTime.formatIntl(dt, formatter)
* console.log(formatted.length > 0) // true
* ```
*
* @see {@link formatUtc} for formatting with options forced to UTC
* @see {@link formatIso} for stable ISO formatting
*
* @category formatting
* @since 3.6.0
*/
(format: Intl.DateTimeFormat): (self: DateTime) => string
/**
* Formats a `DateTime` as a string using the `Intl.DateTimeFormat` API.
*
* **When to use**
*
* Use when you already have an `Intl.DateTimeFormat` and want it to control the
* locale, time zone, and formatting options.
*
* **Details**
*
* The formatter receives the `DateTime` epoch milliseconds. Any time zone
* conversion comes from the supplied formatter.
*
* **Example** (Formatting DateTime values with custom formatters)
*
* ```ts
* import { DateTime } from "effect"
*
* const dt = DateTime.makeUnsafe("2024-06-15T14:30:00Z")
*
* // Create a custom formatter
* const formatter = new Intl.DateTimeFormat("de-DE", {
* year: "numeric",
* month: "long",
* day: "numeric",
* hour: "2-digit",
* minute: "2-digit",
* timeZone: "Europe/Berlin"
* })
*
* const formatted = DateTime.formatIntl(dt, formatter)
* console.log(formatted.length > 0) // true
* ```
*
* @see {@link formatUtc} for formatting with options forced to UTC
* @see {@link formatIso} for stable ISO formatting
*
* @category formatting
* @since 3.6.0
*/
(self: DateTime, format: Intl.DateTimeFormat): string
} = Internal.formatIntl
/**
* Formats a `DateTime` as a UTC ISO string.
*
* **Details**
*
* Always returns the UTC representation in ISO 8601 format, ignoring any time zone.
*
* **Example** (Formatting DateTime values as ISO strings)
*
* ```ts
* import { DateTime } from "effect"
*
* const dt = DateTime.makeUnsafe("2024-01-01T12:30:45.123Z")
* console.log(DateTime.formatIso(dt)) // "2024-01-01T12:30:45.123Z"
*
* const zoned = DateTime.makeZonedUnsafe("2024-01-01T12:30:45.123Z", {
* timeZone: "Europe/London"
* })
* console.log(DateTime.formatIso(zoned)) // "2024-01-01T12:30:45.123Z"
* ```
*
* @category formatting
* @since 3.6.0
*/
export const formatIso: (self: DateTime) => string = Internal.formatIso
/**
* Formats a `DateTime` as a time zone adjusted ISO date string.
*
* **Details**
*
* Returns only the date part (YYYY-MM-DD) after applying time zone adjustments.
*
* **Example** (Formatting DateTime values as ISO dates)
*
* ```ts
* import { DateTime } from "effect"
*
* const dt = DateTime.makeUnsafe("2024-01-01T23:30:00Z")
* console.log(DateTime.formatIsoDate(dt)) // "2024-01-01"
*
* const zoned = DateTime.makeZonedUnsafe("2024-01-01T23:30:00Z", {
* timeZone: "Pacific/Auckland" // UTC+12/13
* })
* console.log(DateTime.formatIsoDate(zoned)) // "2024-01-02" (next day in Auckland)
* ```
*
* @category formatting
* @since 3.6.0
*/
export const formatIsoDate: (self: DateTime) => string = Internal.formatIsoDate
/**
* Formats a `DateTime` as a UTC ISO date string.
*
* **Details**
*
* Returns only the date part (YYYY-MM-DD) in UTC, ignoring any time zone.
*
* **Example** (Formatting DateTime values as UTC ISO dates)
*
* ```ts
* import { DateTime } from "effect"
*
* const dt = DateTime.makeUnsafe("2024-01-01T23:30:00Z")
* console.log(DateTime.formatIsoDateUtc(dt)) // "2024-01-01"
*
* const zoned = DateTime.makeZonedUnsafe("2024-01-01T23:30:00Z", {
* timeZone: "Pacific/Auckland"
* })
* console.log(DateTime.formatIsoDateUtc(zoned)) // "2024-01-01" (always UTC)
* ```
*
* @category formatting
* @since 3.6.0
*/
export const formatIsoDateUtc: (self: DateTime) => string = Internal.formatIsoDateUtc
/**
* Formats a `DateTime.Zoned` as an ISO string with an offset.
*
* **Details**
*
* For `DateTime.Utc`, returns the same as `formatIso`. For `DateTime.Zoned`,
* includes the time zone offset in the format.
*
* **Example** (Formatting DateTime values with offsets)
*
* ```ts
* import { DateTime } from "effect"
*
* const utc = DateTime.makeUnsafe("2024-01-01T12:00:00Z")
* console.log(DateTime.formatIsoOffset(utc)) // "2024-01-01T12:00:00.000Z"
*
* const zoned = DateTime.makeZonedUnsafe("2024-01-01T12:00:00Z", {
* timeZone: DateTime.zoneMakeOffset(3 * 60 * 60 * 1000)
* })
* console.log(DateTime.formatIsoOffset(zoned)) // "2024-01-01T15:00:00.000+03:00"
* ```
*
* @category formatting
* @since 3.6.0
*/
export const formatIsoOffset: (self: DateTime) => string = Internal.formatIsoOffset
/**
* Formats a `DateTime.Zoned` as a string.
*
* **Details**
*
* It uses the format: `YYYY-MM-DDTHH:mm:ss.sss+HH:MM[Time/Zone]`.
*
* **Example** (Formatting zoned DateTime values)
*
* ```ts
* import { DateTime } from "effect"
*
* const zoned = DateTime.makeZonedUnsafe("2024-06-15T14:30:45.123Z", {
* timeZone: "Europe/London"
* })
*
* const formatted = DateTime.formatIsoZoned(zoned)
* console.log(formatted) // "2024-06-15T15:30:45.123+01:00[Europe/London]"
*
* const offsetZone = DateTime.makeZonedUnsafe("2024-06-15T14:30:45.123Z", {
* timeZone: DateTime.zoneMakeOffset(3 * 60 * 60 * 1000)
* })
*
* const offsetFormatted = DateTime.formatIsoZoned(offsetZone)
* console.log(offsetFormatted) // "2024-06-15T17:30:45.123+03:00"
* ```
*
* @category formatting
* @since 3.6.0
*/
export const formatIsoZoned: (self: Zoned) => string = Internal.formatIsoZoned
/**
* Create a Layer from the given time zone.
*
* **Details**
*
* This layer provides the `CurrentTimeZone` service with the specified time zone.
*
* **Example** (Providing current time zone layers)
*
* ```ts
* import { DateTime, Effect } from "effect"
*
* const zone = DateTime.zoneMakeNamedUnsafe("Europe/London")
* const layer = DateTime.layerCurrentZone(zone)
*
* const program = Effect.gen(function*() {
* const now = yield* DateTime.nowInCurrentZone
* return DateTime.formatIsoZoned(now)
* })
*
* // Use the layer to provide the time zone
* Effect.provide(program, layer)
* ```
*
* @category current time zone
* @since 3.6.0
*/
export const layerCurrentZone: (resource: NoInfer<TimeZone>) => Layer.Layer<CurrentTimeZone> = Layer.succeed(
CurrentTimeZone
)
/**
* Create a Layer from the given time zone offset.
*
* **Details**
*
* This layer provides the `CurrentTimeZone` service with a fixed offset time zone.
*
* **Example** (Providing fixed-offset time zone layers)
*
* ```ts
* import { DateTime, Effect } from "effect"
*
* // Create a layer for UTC+3
* const layer = DateTime.layerCurrentZoneOffset(3 * 60 * 60 * 1000)
*
* const program = Effect.gen(function*() {
* const now = yield* DateTime.nowInCurrentZone
* return DateTime.formatIsoZoned(now)
* })
*
* Effect.provide(program, layer)
* ```
*
* @category current time zone
* @since 3.6.0
*/
export const layerCurrentZoneOffset = (offset: number): Layer.Layer<CurrentTimeZone> =>
Layer.succeed(CurrentTimeZone)(Internal.zoneMakeOffset(offset))
/**
* Create a Layer from the given IANA time zone identifier.
*
* **Details**
*
* This layer provides the `CurrentTimeZone` service with a named time zone.
* If the time zone identifier is invalid, the layer will fail.
*
* **Example** (Providing named time zone layers)
*
* ```ts
* import { DateTime, Effect } from "effect"
*
* const layer = DateTime.layerCurrentZoneNamed("Europe/London")
*
* const program = Effect.gen(function*() {
* const now = yield* DateTime.nowInCurrentZone
* return DateTime.formatIsoZoned(now)
* })
*
* Effect.provide(program, layer)
* ```
*
* @category current time zone
* @since 3.6.0
*/
export const layerCurrentZoneNamed: (zoneId: string) => Layer.Layer<
CurrentTimeZone,
IllegalArgumentError
> = flow(Internal.zoneMakeNamedEffect, Layer.effect(CurrentTimeZone))
/**
* Create a Layer from the system's local time zone.
*
* **Details**
*
* This layer provides the `CurrentTimeZone` service using the system's
* configured local time zone.
*
* **Example** (Providing local time zone layers)
*
* ```ts
* import { DateTime, Effect } from "effect"
*
* const program = Effect.gen(function*() {
* const now = yield* DateTime.nowInCurrentZone
* return DateTime.formatIsoZoned(now)
* })
*
* // Use the system's local time zone
* Effect.provide(program, DateTime.layerCurrentZoneLocal)
* ```
*
* @category current time zone
* @since 3.6.0
*/
export const layerCurrentZoneLocal: Layer.Layer<CurrentTimeZone> = Layer.sync(CurrentTimeZone)(zoneMakeLocal)

Xet Storage Details

Size:
126 kB
·
Xet hash:
49a7ce795940885b3272a39f908edb560a6a0216fd555df2158bda7430476d7e

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.