Date Utilities
Purpose: Unified parsing, validation, formatting, and serialization of dates and date-times using a subset of Moment.js format patterns for configuration and output.
What You Get
- Parse inbound strings to native Date.
- Serialize Date / epoch / string into normalized date or date-time strings.
- Validate user input against expected formats.
- Format values in either exact (configured) or friendly locale-aware styles.
- Produce ISO (UTC) outputs when required.
Configuration (optional)
- locale: BCP-47 locale applied to formatting.
- longDateFormat: Only tokens L (date) and LTS (time with seconds) are honored (legacy compatibility).
- exactDateFormat / exactTimeFormat / exactDateTimeFormat: Accept Moment.js format strings to override default patterns.
- formatIsoDateTimeInTimeZone: Force serialization in a specific zone.
- formatIsoDateTimeInUtc: Force UTC with trailing Z. (If neither zone flag is set, original components are preserved.)
Input Types Accepted Everywhere
- Native Date
- Number (milliseconds or seconds epoch; seconds auto-detected)
- String (ISO or previously formatted)
Core Functions (Summary)
Parsing / Serialization:
- deserializeDate(text): Returns Date or null.
- serializeDate(value, format?): Returns date string (default MM/DD/YYYY).
- serializeDateTime(value, format?): Returns date-time string (default MM/DD/YYYY HH:mm:ss).
Validation:
- validateDate(text, format?): true if matches (or ISO when no format).
- validateDateTime(text, format?): same for date-time.
Formatting (auto-applies locale and config):
- formatDate(value)
- formatDateTime(value)
- formatExactDate(value)
- formatExactTime(value)
- formatExactDateTime(value)
- formatFriendlyDate(value)
- formatFriendlyDateTime(value)
- formatFriendlyDateTimeNow(value): Relative (e.g. 3 minutes ago).
- formatISODate(value): Full ISO UTC with milliseconds.
- formatISODateTime(value): ISO UTC without milliseconds.
Behavior Notes
- Exact format functions prefer explicit exact* config; otherwise fallback locale presets.
- Friendly variants use medium presets.
- Seconds in time outputs depend on longDateFormat containing LTS unless an exact pattern overrides.
- Validation is strict: supply the expected format when not ISO.
- Zone handling for serialization: explicit target zone (formatIsoDateTimeInTimeZone) overrides UTC flag, which overrides unchanged behavior.
Moment Format Scope
Only limited tokens (L, LTS) and locale passthrough are honored; do not rely on broader Moment formatting semantics. Custom formats should use Moment.js style tokens (e.g. MM/DD/YYYY, HH:mm:ss).
When To Use Which
- Need user-facing display: formatFriendlyDate* functions.
- Need guaranteed stable machine string: formatISODateTime or serializeDateTime with explicit format.
- Accepting user input: validateDate / validateDateTime, then deserializeDate.
Errors / Nulls
- Falsy or invalid parse input → null (deserialize).
- Validation failure → false (validate functions).
- Formatting with invalid value may yield empty string.
Minimal Example (conceptual)
deserializeDate("2025-10-21")
serializeDateTime(new Date())
formatFriendlyDateTimeNow(new Date())
formatExactDateTime(new Date())