@burglekitt/gmt
Version:
Temporal-based date and time utilities with timezone support and polyfill integration
37 lines (36 loc) • 1.95 kB
JavaScript
import { Temporal } from "@js-temporal/polyfill";
import { isValidZonedDateTime } from "../validate/index.js";
/**
* Sort an array of ZonedDateTime values in ascending or descending order.
*
* - Invalid dates are filtered out.
* - Defaults to ascending order (earliest first).
* - Returns empty array if no valid dates.
*
* @param zonedDateTimes Array of ISO ZonedDateTime strings
* @param order "asc" for ascending (earliest first) | "desc" for descending (latest first)
* @returns Sorted array of zoned datetime strings
*
* @example sortZoned(["2024-03-10T12:00:00[America/New_York]", "2024-01-01T08:00:00[America/New_York]", "2024-02-15T15:30:00[America/New_York]"]) // ["2024-01-01T08:00:00-05:00[America/New_York]", "2024-02-15T15:30:00-05:00[America/New_York]", "2024-03-10T12:00:00-04:00[America/New_York]"]
* @example sortZoned(["2024-03-10T12:00:00[America/New_York]", "2024-01-01T08:00:00[America/New_York]", "2024-02-15T15:30:00[America/New_York]"], "desc") // ["2024-03-10T12:00:00-04:00[America/New_York]", "2024-02-15T15:30:00-05:00[America/New_York]", "2024-01-01T08:00:00-05:00[America/New_York]"]
* @example sortZoned(["invalid", "2024-01-01T08:00:00[America/New_York]", "2024-02-15T15:30:00[America/New_York]"]) // ["2024-01-01T08:00:00-05:00[America/New_York]", "2024-02-15T15:30:00-05:00[America/New_York]"]
* @example sortZoned([]) // []
*/
export function sortZoned(zonedDateTimes, order = "asc") {
if (!zonedDateTimes.length)
return [];
const valid = zonedDateTimes.filter(isValidZonedDateTime);
if (!valid.length)
return [];
try {
const comparables = valid.map((d) => Temporal.ZonedDateTime.from(d));
comparables.sort(Temporal.ZonedDateTime.compare);
if (order === "desc") {
return comparables.reverse().map((d) => d.toString());
}
return comparables.map((d) => d.toString());
}
catch {
return [];
}
}