@burglekitt/gmt
Version:
Temporal-based date and time utilities with timezone support and polyfill integration
46 lines (45 loc) • 1.89 kB
JavaScript
import { Temporal } from "@js-temporal/polyfill";
import { isValidZonedDateTime } from "../validate/index.js";
/**
* Compare two zoned datetime strings for exact local-field equality.
*
* - Inputs must be valid ISO 8601 zoned datetime strings.
* - Returns `true` when year/month/day/hour/minute/second/millisecond/microsecond/nanosecond and IANA timeZone id all match; otherwise `false`.
* - Invalid inputs return `false`.
*
* @param value1 first zoned datetime string
* @param value2 second zoned datetime string
* @returns boolean indicating whether the two zoned datetimes are equal
*
* @example areZonedEqual("2024-02-29T12:34:56.789+00:00[UTC]", "2024-02-29T12:34:56.789+00:00[UTC]") // true
* @example areZonedEqual("invalid", "2024-02-29T12:34:56.789+00:00[UTC]") // false
*/
export function areZonedEqual(value1, value2) {
if (!isValidZonedDateTime(value1) || !isValidZonedDateTime(value2)) {
return false;
}
let zonedDateTime1;
let zonedDateTime2;
try {
zonedDateTime1 = Temporal.ZonedDateTime.from(value1);
zonedDateTime2 = Temporal.ZonedDateTime.from(value2);
}
catch {
return false;
}
try {
return (zonedDateTime1.year === zonedDateTime2.year &&
zonedDateTime1.month === zonedDateTime2.month &&
zonedDateTime1.day === zonedDateTime2.day &&
zonedDateTime1.hour === zonedDateTime2.hour &&
zonedDateTime1.minute === zonedDateTime2.minute &&
zonedDateTime1.second === zonedDateTime2.second &&
zonedDateTime1.millisecond === zonedDateTime2.millisecond &&
zonedDateTime1.microsecond === zonedDateTime2.microsecond &&
zonedDateTime1.nanosecond === zonedDateTime2.nanosecond &&
zonedDateTime1.timeZoneId === zonedDateTime2.timeZoneId);
}
catch {
return false;
}
}