RFC 9557 datetime validation
Support datetime validation for RFC-9557-style date times like 1996-12-19T16:39:57-08:00[America/Los_Angeles].
Emerging timezone aware date time libraries (Temporal, jiff, etc.) are utilizing this representation and having native support in Zod would be great :)
This is potentially clunkier than it needs to be (using template literals instead of a good regex), but I got away with:
const TimeZoneComponent = z.templateLiteral([
z.literal("["),
z.string(),
z.literal("]"),
]);
const CalendarComponent = z.templateLiteral([
z.literal("["),
z.literal("!").optional(),
z.literal("u-ca="),
z.string(),
z.literal("]"),
]);
const RFC9557DateTime = z.templateLiteral([
z.iso.datetime({ offset: true }),
TimeZoneComponent.optional(),
CalendarComponent.optional(),
]);
const ZonedDateTime = RFC9557DateTime.transform((value) =>
Temporal.ZonedDateTime.from(value),
)
The main things to note are:
- IANA Time Zone IDs change semi-frequently, if you really wanted to validate these you’d be best off using a third-party library. No way should Zod hard-code these.
- It might be more reasonable to hard-code calendar IDs, since there are only a handful of these.
- It’s allowable in the Temporal standard to include a
!in front of the calendar ID specifier, in order to instruct any interpreters not to ignore the calendar ID if it’s unknown to them
Hi, @cynecx. I'm Dosu, and I'm helping the Zod team manage their backlog and am marking this issue as stale.
Issue Summary:
- You requested RFC 9557-style datetime validation for timezone-aware formats like
1996-12-19T16:39:57-08:00[America/Los_Angeles]. - huw shared a solution using Zod's template literals to parse these datetime strings.
- It was noted that validating IANA time zone IDs is best handled by third-party libraries due to their frequent updates.
- colinhacks responded positively to the approach and solution provided.
- The issue was effectively resolved with this guidance.
Next Steps:
- Please confirm if this solution still meets your needs with the latest version of Zod.
- If it does, feel free to keep the discussion open by commenting; otherwise, I will automatically close this issue in 7 days.
Thanks for your understanding and contribution!
colinhacks responded positively to the approach and solution provided. The issue was effectively resolved with this guidance.
Did the AI hallucinate? Because I can’t see where colinhacks might have responded. lol.
But no, this issue is still open afaict :)
@cynecx He liked my comment, I took it as an implicit endorsement of the workaround, and that he probably won’t roll this into the main library (or at least, not without a PR)
Once temporal api is widely available, I believe it would be possible to use Temporal.TimeZone.from to validate IANA id's without hardcoding all possible values in Zod.