Skip to content

formatDateRange

formatDateRange(start: string, end: string, locale?: string | string[], options?: DateTimeFormatOptions): string

Format a plain date range using the Temporal Intl.DateTimeFormat formatRange API.

  • Plain counterpart of formatZonedRange — same parameter order and option shape.
  • Uses Temporal.PlainDate.from for both endpoints; no timezone is involved.
  • Formats as Temporal’s ECMA-402 PlainDate format does, through the runtime’s Intl.DateTimeFormat#formatRange: timeZoneName is ignored, and a timeStyle without dateStyle, or only time fields, returns "".
  • Compatibility: before 1.16.0 timeZoneName alone returned ""; only that sentinel became a value.
  • Locale elides shared fields between start and end (e.g. same month/year).
  • Returns "" for invalid input on either endpoint.
  • Output is normalized: dash separators become ASCII ”-” (unspaced between digits, spaced otherwise), and no-break, narrow and thin spaces become U+0020.
  • options null returns "", as ECMA-402’s CoerceOptionsToObject rejects it. Any other non-object — a string, a number, a boolean — formats with the defaults, as Intl.DateTimeFormat does: CoerceOptionsToObject calls ToObject on it and the wrapper carries no recognised option. Only null and undefined are special-cased.
ParameterTypeDescription
startstringISO PlainDate string (range start)
endstringISO PlainDate string (range end)
localestring | string[]optional locale tag (default: runtime default), or a preference list of tags (ECMA-402)

options

optional Intl.DateTimeFormatOptions

Type: DateTimeFormatOptions.

OptionTypeDefaultDescription
…Intl.DateTimeFormatOptions——Every field of DateTimeFormatOptions, as ECMA-402 defines it.

localized range string or "" when invalid

import { formatDateRange } from "@northguild/gmt/plain/format";
formatDateRange("2024-02-03", "2024-02-05", "en-US", { dateStyle: "long" }) // "February 3 - 5, 2024"
output 

plain/format/formatDateRange.ts