Skip to content

intervalAbutsZoned

intervalAbutsZoned(aStart: string, aEnd: string, bStart: string, bEnd: string): boolean

Return true when two half-open zoned intervals [start, end) are exactly adjacent — one ends at the instant the other starts, so they share no instant and leave no gap (Allen’s “meets”, either order).

  • Uses Temporal.Instant.compare for comparison (via .toInstant()), so the shared instant may be spelled in different zones.
  • Returns true when aEnd is the same instant as bStart, or bEnd the same instant as aStart, and neither interval is empty. No instant is stepped by a nanosecond, so an interval ending at the last representable instant is handled like any other.
  • Returns false when intervals overlap, are disjoint with a gap (even one nanosecond), are invalid, or when either is empty (start and end the same instant): an empty interval abuts nothing.
  • Returns false on invalid input (wrong type, malformed strings, leap seconds).
  • Accepts mixed calendar systems (E7’s D4-zoned, issue #152): both bare ISO zoned strings and RFC 9557 calendar-annotated ones ("2024-02-24T14:30:00-05:00[America/New_York][u-ca=hebrew]"), and the two endpoints need not agree on a calendar. Ordering is calendar-independent — verified that Temporal.Instant carries no calendar field at all and that Instant.compare/ZonedDateTime.compare both return 0 for the same instant expressed in hebrew, islamic-civil, japanese and iso8601.
  • Rejects a calendar annotation before the time zone annotation, which is not RFC 9557.
  • Compatibility: since 1.16.0 calendar strings are RFC 9557 (ISO digits, the [u-ca=<id>] annotation after the zone, canonical calendar ids); see isValidCalendarZonedDateTime.
ParameterTypeDescription
aStartstringISO 8601 zoned datetime string for the first interval start
aEndstringISO 8601 zoned datetime string for the first interval end
bStartstringISO 8601 zoned datetime string for the second interval start
bEndstringISO 8601 zoned datetime string for the second interval end

true if intervals are exactly adjacent, or false on invalid input

import { intervalAbutsZoned } from "@northguild/gmt/zoned/interval";
intervalAbutsZoned("2024-01-01T09:00:00+00:00[UTC]", "2024-06-30T12:00:00+00:00[UTC]", "2024-06-30T12:00:00+00:00[UTC]", "2024-12-31T17:00:00+00:00[UTC]") // true
output 

zoned/interval/intervalAbutsZoned.ts