intervalXorAllZoned
Signature
Section titled “Signature”intervalXorAllZoned(intervals: { start: string; end: string; }[]): { start: string; end: string; }[]Return the symmetric difference across a list of zoned intervals — the set of instants covered by an odd number of the input intervals.
- List-form generalization of
intervalXorZoned, which is pairwise only. - Intervals are half-open
[start, end). The result is every maximal run of instants where the coverage count is odd, so touching runs join and an empty interval (startandendthe same instant) changes nothing. Every boundary is an input’s ownstartorend; none is stepped by a nanosecond, so an interval may end on the last representable instant. For two intervals this is exactlyintervalXorZoned’s pairwise result. - Output boundaries carry the time zone of whichever input interval contributed them (the earlier one in the list on a tie).
- Order of the input list does not matter; the result is sorted by start instant.
- Returns
[]for an empty list, and[]when every instant is covered an even number of times (e.g. two identical intervals cancel out). - Returns
[]whenintervalsis not an array, when any element is not a{ start, end }record of valid ISO ZonedDateTime strings, or when any element hasstart > endor a leap-second string. - Accepts RFC 9557 calendar-annotated zoned strings (as produced by
convertZonedToCalendar) as well as bare ISO ones — E7 (issue #152) — but rejects a mismatched set: every endpoint in the list must name the same calendar system (E7’s D4-zoned). This function returns values the caller reads back as datetimes, and an array whose elements carried different calendar tags would be unreadable as a set. A mismatch returns[]. - Output boundaries are re-derived in the resolved calendar via
formatZonedInCalendar, never copied from an input string (E7’s D7-zoned).
Parameters
Section titled “Parameters”| Parameter | Type | Description |
|---|---|---|
intervals | { start: string; end: string; }[] | array of { start, end } records |
Returns
Section titled “Returns”array of { start, end } records covered an odd number of times, or [] on invalid input
Members of each item
| Member | Type | Description |
|---|---|---|
start | string | The instant the interval begins at, as a zoned ISO 8601 string with offset and bracketed time zone. It keeps a calendar annotation such as [u-ca=hebrew] when the inputs carry one. |
end | string | The 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. |
Examples
Section titled “Examples”import { intervalXorAllZoned } from "@northguild/gmt/zoned/interval";
intervalXorAllZoned([{ start: "2024-01-01T00:00:00+00:00[UTC]", end: "2024-01-10T00:00:00+00:00[UTC]" }, { start: "2024-01-05T00:00:00+00:00[UTC]", end: "2024-01-15T00:00:00+00:00[UTC]" }]) // [{ start: "2024-01-01T00:00:00+00:00[UTC]", end: "2024-01-05T00:00:00+00:00[UTC]" }, { start: "2024-01-10T00:00:00+00:00[UTC]", end: "2024-01-15T00:00:00+00:00[UTC]" }]