@burglekitt/gmt
Version:
Temporal-based date and time utilities with timezone support and polyfill integration
39 lines (38 loc) • 2.58 kB
TypeScript
import type { Overflow, TimeCycleField } from "../../types/index.js";
/**
* Return a PlainTime ISO string with `field` cycled by `amount`, wrapping at that field's own
* min/max instead of carrying into the next larger field (`hour` 23 `+1` wraps to `0`, it never
* changes a date — `cycleTime` has no date component to carry into in the first place).
*
* - `hour` always cycles `0–23`. GMT has no `hourCycle: 12` option — a 12-hour, AM/PM-preserving
* wrap is a display/formatting concern (locale-driven, via `Intl`), not a value-layer one: there
* is no ISO representation for "this hour, but staying AM" to round-trip through GMT's string
* contract.
* - `minute`/`second` wrap `0–59`; `millisecond`/`microsecond`/`nanosecond` wrap `0–999`.
* - `options.round` does **not** round to the nearest increment — it steps to the *next* multiple
* of `amount` in the direction of its sign (ceiling for positive, floor for negative), matching
* `@internationalized/date`'s `CycleOptions.round`. E.g. cycling minute `22` by `+15` with
* `round: true` lands on `30` (the next multiple of 15 above 22), not `15` (the nearest one).
* - `options.overflow` is accepted for signature consistency with `cycleDate`/`cycleDateTime`/
* `cycleZoned` but is **inert** here: time fields don't share bounds the way `day` shares a
* month with `month`/`year`, so the wrapped value `cycleTime` computes is always already valid —
* `setTime`'s `.with()` call never has anything to constrain or reject.
* - Returns "" for an invalid `value` or an invalid `field`.
*
* @param value ISO PlainTime string
* @param field the field to cycle: "hour" | "minute" | "second" | "millisecond" | "microsecond" | "nanosecond"
* @param amount signed amount to cycle by
* @param options optional: round (boolean, default false), overflow ("constrain" | "reject", inert — see above)
* @returns ISO PlainTime string with `field` cycled, or "" on invalid input
*
* @example cycleTime("09:30:00", "hour", 1) // "10:30:00"
* @example cycleTime("23:00:00", "hour", 1) // "00:00:00" (wraps)
* @example cycleTime("00:00:00", "hour", 25) // "01:00:00" (amount larger than the range)
* @example cycleTime("09:22:00", "minute", 15, { round: true }) // "09:30:00"
* @example cycleTime("09:30:00", "year", 1) // "" ("year" is not a cyclable time field)
* @example cycleTime("invalid", "hour", 1) // ""
*/
export declare function cycleTime(value: string, field: TimeCycleField, amount: number, options?: {
round?: boolean;
overflow?: Overflow;
}): string;