Skip to content

intervalXorUtc

intervalXorUtc(aStart: string, aEnd: string, bStart: string, bEnd: string): { start: string; end: string; }[]

Return the symmetric difference of two UTC intervals — time covered by exactly one interval.

  • Half-open: an interval holds every t with start <= t < end. The result is every maximal run covered by exactly one of the two intervals, sorted by start — the same set as CORE-6’s mergeIntervals([...subtractIntervals(a, [b]), ...subtractIntervals(b, [a])]).
  • Pieces end exactly where the other interval starts; no piece is stepped by one nanosecond.
  • Touching intervals (aEnd === bStart) share nothing, so they return one combined run.
  • Returns [] when the intervals are identical. An empty interval contributes nothing.
  • Returns [] if either interval is invalid (start > end).
  • Returns [] on invalid input (wrong type, malformed strings, leap seconds).
ParameterTypeDescription
aStartstringISO 8601 UTC datetime string for the first interval start
aEndstringISO 8601 UTC datetime string for the first interval end
bStartstringISO 8601 UTC datetime string for the second interval start
bEndstringISO 8601 UTC datetime string for the second interval end

array of { start, end } records representing the symmetric difference, or [] on invalid input

Members of each item

MemberTypeDescription
startstringThe instant the interval begins at, as an ISO 8601 UTC string ending in Z.
endstringThe first instant after the interval, in the same format as start. It is exclusive: the interval holds everything from start up to but not including this value. It is always later than start.
import { intervalXorUtc } from "@northguild/gmt/utc/interval";
intervalXorUtc("2024-01-01T09:00:00Z", "2024-01-01T13:00:00Z", "2024-01-01T12:00:00Z", "2024-01-01T17:00:00Z") // [{ start: "2024-01-01T09:00:00Z", end: "2024-01-01T12:00:00Z" }, { start: "2024-01-01T13:00:00Z", end: "2024-01-01T17:00:00Z" }]
output 

utc/interval/intervalXorUtc.ts