ISO 8601 and RFC 3339 validator
Paste a date or a timestamp and get two verdicts, one for ISO 8601 and one for the narrower RFC 3339 profile, each with the reason when it fails. The page also shows the instant the text names and what your browser's Date.parse makes of it. Nothing you type leaves your browser.
The tool
How to use
- Paste or type the text in Date or date-time. The buttons under the box fill in instructive examples.
- Read the status line. It says what the text was read as: a date in calendar, ordinal or week form, or a date-time, in basic format (no hyphens and colons) or extended format.
- Read the two verdict cards. ISO 8601 says whether the notation is valid in the standard, with the date checked against the real calendar. RFC 3339 says whether it is also a valid Internet timestamp. A red card lists the reasons, and notes are shown when something is valid but worth knowing.
- Under What it means, a date is also shown in the other date forms (calendar, ordinal, week) with its weekday; a date-time with an offset also shows the UTC instant and its Unix seconds. Hour 24 is read as 00:00 of the next day.
- The last block shows what
Date.parsein your browser does with the same text. It is an observation about your browser, not a verdict.
Worked examples
Every verdict printed here is recomputed by an automated test from the same engine as the tool. The calendar and week arithmetic behind them is checked against Python's datetime on thousands of random dates.
The profile everyone means
Input: 2026-03-08T02:30:00-05:00
Verdicts: ISO 8601 valid; RFC 3339 valid.
Input: 2026-03-08T02:30:00-05:00
Instant: 2026-03-08T07:30:00Z
02:30 at -05:00 is 07:30 UTC. (It is a real clock time in New York only before the clocks change on 8 March 2026; 02:30 on that date does not exist there, but the offset in the text is what the string says, so the string is valid and names an instant.)
Basic format, and the other date forms
Input: 20260308T023000Z
Verdicts: ISO 8601 valid; RFC 3339 valid.
Input: 2026-W10-7
Verdicts: ISO 8601 valid; RFC 3339 not valid. Why: RFC 3339 allows only the calendar date YYYY-MM-DD, not week dates.
Input: 2026-067
Verdicts: ISO 8601 valid; RFC 3339 not valid. Why: RFC 3339 allows only the calendar date YYYY-MM-DD, not ordinal dates.
Input: 2026-W53-1
Verdicts: ISO 8601 valid; RFC 3339 not valid. Why: RFC 3339 allows only the calendar date YYYY-MM-DD, not week dates.
All three of 2026-03-08, 2026-W10-7 and 2026-067 name the same day, a Sunday. A week-numbering year can have 52 or 53 weeks: 2026 has 53, 2025 has only 52 (see "What goes wrong").
Hour 24
Input: 2026-12-31T24:00:00Z
Verdicts: ISO 8601 valid; RFC 3339 not valid. Why: RFC 3339 section 5.7: hour is 00 to 23 (the profile deliberately forbids 24).
Input: 2026-12-31T24:00:00Z
Instant: 2027-01-01T00:00:00Z
Leap seconds
Input: 2016-12-31T23:59:60Z
Verdicts: ISO 8601 valid; RFC 3339 valid. Note: A real leap second: UTC had 23:59:60 on 2016-12-31.
Input: 2016-12-31T23:59:60Z
Instant: 2017-01-01T00:00:00Z
A Unix timestamp does not count leap seconds, so the leap second and the next midnight share one number. The same second written in another offset is recognised too:
Input: 2017-01-01T00:59:60+01:00
Verdicts: ISO 8601 valid; RFC 3339 valid. Note: A real leap second: UTC had 23:59:60 on 2016-12-31.
Lower case
Input: 2026-03-08t02:30:00z
Verdicts: ISO 8601 valid; RFC 3339 valid. Note: Lower-case "t": RFC 3339 section 5.6 says that, per ABNF and ISO 8601, the "T" and "Z" may alternatively be lower case, and that generators should use upper case.
What goes wrong
Strings that look right and are not, or look wrong and are accepted. Each result is the tool's exact output.
Where the two verdicts disagree
Input: 2026-03-08 02:30:00z
Verdicts: ISO 8601 not valid; RFC 3339 valid. Why: ISO 8601 separates date and time with the letter T, not a space.
Input: 2026-03-08T02:30:00
Verdicts: ISO 8601 valid; RFC 3339 not valid. Why: RFC 3339 requires an offset: Z or +hh:mm / -hh:mm. Without one, the time is "unqualified local time" (section 4.4), which the RFC deems unacceptable for the Internet.
Input: 2026-03-08T02:30:00-00:00
Verdicts: ISO 8601 not valid; RFC 3339 valid. Why: ISO 8601 always writes a zero offset as positive (+00:00 or Z); a negative zero is not an ISO 8601 offset.
Input: 2026-03-08T02:30:00+0530
Verdicts: ISO 8601 valid; RFC 3339 not valid. Why: RFC 3339 offsets are Z or ±hh:mm with a colon and minutes; "+0530" is not.
Input: 2026-03-08T02:30:00,5Z
Verdicts: ISO 8601 valid; RFC 3339 not valid. Why: RFC 3339 time-secfrac uses a full stop (.), not a comma.
The missing offset is the most common bug: 2026-03-08T02:30:00 is a perfectly good ISO 8601 local time, but it is not an instant, and two servers in different zones will read it as different instants.
Dates that do not exist
Input: 2026-02-30
Verdicts: ISO 8601 not valid; RFC 3339 not valid. Why: Day 30 does not exist in 2026-02 (01 to 28, not a leap year).
Input: 2025-W53-1
Verdicts: ISO 8601 not valid; RFC 3339 not valid. Why: Week 53 does not exist in 2025: that week-year has 52 weeks.
Input: 2026-366
Verdicts: ISO 8601 not valid; RFC 3339 not valid. Why: Day-of-year 366 does not exist in 2026 (001 to 365).
Input: 2026-03-08T25:00:00Z
Verdicts: ISO 8601 not valid; RFC 3339 not valid. Why: Hour 25 does not exist (00 to 23; 24 only as 24:00:00).
Not ISO 8601 at all
Input: 03/08/2026
Verdicts: ISO 8601 not valid; RFC 3339 not valid. Why: "03/08/2026" is a numeric day-month-year or month-day-year date, and the order is ambiguous; ISO 8601 always writes the year first, with hyphens or none: YYYY-MM-DD.
A leap second that did not happen
Input: 2026-06-30T23:59:60Z
Verdicts: ISO 8601 valid; RFC 3339 valid. Note: No leap second was inserted at the end of 2026-06-30 (IANA list, read 2026-10-03), so this :60 names a second that never occurred.
The string is well-formed and RFC 3339 does allow second 60 at the end of June, so both cards are green. The note is what tells you that 30 June 2026 had no leap second.
"It parsed in my browser, so it is valid"
JavaScript's Date.parse is only required to accept one format. Anything else is up to the engine, so a string that one browser accepts can give NaN in another. The last block of the tool shows your browser's answer. Use it as an observation, never as the validity test.
Limits & gotchas
- ISO 8601 was not read. The standard is sold by ISO, not published free. The ISO verdicts follow a published summary of the standard (Wikipedia) and the grammar in RFC 3339's Appendix A, which that RFC itself calls informational and possibly erroneous. Where the sources do not say (for example, whether a basic date can be mixed with an extended time), the page does not reject the string for it, it adds a note, and the RFC 3339 verdict, which is defined by a precise grammar, fails.
- Which ISO 8601 edition? The standard has changed between editions, notably for hour 24 (see the FAQ). The validator accepts 24:00 and says so; if you must follow a specific edition, check it.
- Reduced precision and expanded years are partly supported. The tool reads reduced-precision dates (such as
2026-03) and the signed six-digit expanded years that JavaScript uses. It does not handle time intervals (start/end) or repeating intervals, and it refuses them with that reason. - Time zone designators. Only Z and numeric offsets are read. A bracketed zone name such as
[Europe/Berlin]is not part of ISO 8601 or RFC 3339 and is refused. - Leap-second check. The list was read on 2026-10-03; its last entry is the 2016-12-31 leap second and the list itself expires on 2027-06-28; a leap second announced later would not be known to this page until it is updated.
- The Date.parse block depends on your browser and is not a standard behaviour.
FAQ
Is RFC 3339 the same thing as ISO 8601?
No. RFC 3339 is a profile: a narrower format for timestamps on the Internet, built from the same notation. It allows only the calendar date YYYY-MM-DD, needs an offset (Z or +hh:mm), and writes seconds with a full stop. ISO 8601 also has week dates, ordinal dates, basic formats without hyphens or colons, and times without an offset. A few details go the other way: RFC 3339 allows a space instead of T and lower-case t and z, and defines -00:00 as "offset unknown", none of which this page treats as plain ISO 8601. That is why the validator gives two verdicts.
Is 24:00:00 a valid time?
Under ISO 8601, 24:00 as the end of a day was allowed in the 2004 edition, removed in ISO 8601-1:2019 and reintroduced by Amendment 1 in 2022, according to Wikipedia's summary of the standard. The validator therefore accepts it as ISO 8601 and reads 2026-12-31T24:00:00Z as the start of 2027. RFC 3339 does not allow hour 24: its hour is 00 to 23.
Can the seconds field be 60?
Only for a leap second. RFC 3339 allows second 60 and says a leap second can only occur at the end of a month, in practice June or December. The validator goes a step further and checks the IANA list of leap seconds, which has 27 entries from 1972 to the end of 2016: 2016-12-31T23:59:60Z is a real one, while 2026-06-30T23:59:60Z is a well-formed string that names a second that never happened, and it says so in a note.
Why does the page also show what Date.parse does?
Because that is what many people really test with. JavaScript's Date.parse is required to accept one simplified format (a subset of ISO 8601), and for anything else the result depends on the engine. The page shows your browser's answer next to the verdict, as an observation, so you can see where "my browser accepts it" and "the standard accepts it" differ. Other browsers can answer differently.
What does "valid" not tell me?
It tells you the text follows the syntax and that the date really exists (no 30 February, no week 53 in a 52-week year). It does not tell you what the sender meant: a timestamp without an offset is valid ISO 8601 and still does not name an instant. The ISO 8601 standard itself is sold, not free, and was not read for this page; the verdicts follow RFC 3339 (including its Appendix A grammar) and a published summary of the standard, and say so where it matters.
Sources
- IETF (RFC Editor): RFC 3339: Date and Time on the Internet: Timestamps Used for: The date-time grammar (section 5.6) and its note that "T" and "Z" may be lower case and the T may be replaced by a space; hour 24 is not allowed; the leap second 60 is only valid at the end of a month, in practice June or December (5.7); -00:00 meaning an unknown local offset (4.3); Appendix A, a collected ABNF for ISO 8601 that the RFC itself calls informational and possibly erroneous.
- Wikipedia: ISO 8601 Used for: Calendar, ordinal and week dates; week 1 is the week with the year's first Thursday; the zero offset is written Z or +00:00 (not -00:00); 24:00 was allowed until the 2004 edition, removed in ISO 8601-1:2019 and reintroduced by Amendment 1 (2022); duration syntax PnYnMnDTnHnMnS, "P" alone is invalid, PT0S and P0D are valid, a fraction only on the smallest component, weeks as PnW, and that PT36H and P1DT12H are different durations across a DST change. ISO 8601 itself is sold, not free; it was not read.
- IANA: leap-seconds.list Used for: The 27 leap seconds inserted since 1972 (TAI minus UTC rose from 10 s to 37 s, last step at the end of 2016-12-31) and that the file carries an expiry time (2027-06-28), after which it must be re-read.
- Ecma International / TC39: ECMAScript Language Specification: Time Values and Time Range; Date.parse; time zone offset helper operations Used for: A time value is milliseconds since 1970-01-01T00:00:00Z with every day exactly 86,400,000 ms (leap seconds are ignored); the range is +-8.64e15 ms (+-100,000,000 days); for a local time that is skipped or repeated, the offset in use before the transition is applied; a skipped local time yields no instant in the time-zone-to-epoch operation.
- MDN Web Docs: Date Used for: The supported range (April 20, 271821 BC to September 13, 275760 AD, plus or minus 100,000,000 days); that Date ignores leap seconds; Number.MAX_SAFE_INTEGER is 9,007,199,254,740,991; the date-time string format (a simplification of ISO 8601, 24:00:00 allowed, expanded years of + or - followed by six digits, -000000 disallowed); and that setting a local time inside a DST transition follows the Temporal "compatible" disambiguation: if the local time corresponds to two instants the earlier one is chosen, and if it does not exist the result goes forward by the gap duration (with the New York 2024 example).
- The Open Group: POSIX.1-2024 Base Definitions, 4.19 Seconds Since the Epoch Used for: Seconds since the Epoch "approximates" the seconds elapsed since the Epoch; the formula that relates a UTC date to it for years from 1970 and non-negative values; "If the year is <1970 or the value is negative, the relationship is undefined"; "each and every day shall be accounted for by exactly 86400 seconds" (so leap seconds are not counted); the relationship to actual UTC is unspecified.
Every document above was opened and read on 2026-10-03. Documentation changes; if a page here disagrees with the current docs, trust the docs and tell us.