Impossible dates test values
Dates that do not exist, that are ambiguous, or that are written differently than the field assumes. 12 values, each with what it breaks and what a correct application does instead.
Type them one at a time with AltShiftN
in the palette, or take them all into a script with nkb emit dates-impossible.
30 February
dates-impossible/feb-30
30.02.2026
30.02.2026
- 10 graphemes
- 10 code points
- 10 bytes
- 10 UTF-16 units
- What it breaks
- A date that cannot exist; naive parsers roll it over to the second of March instead of refusing it.
- What a correct application does
- Rejected with a message - never silently moved to another day.
29 February in a non-leap year
dates-impossible/feb-29-non-leap
29.02.2026
29.02.2026
- 10 graphemes
- 10 code points
- 10 bytes
- 10 UTF-16 units
- What it breaks
- Valid in some years and not in others, so the same input is correct or incorrect depending on the year field next to it.
- What a correct application does
- Rejected for non-leap years, with the reason stated.
31 November
dates-impossible/nov-31
31.11.2026
31.11.2026
- 10 graphemes
- 10 code points
- 10 bytes
- 10 UTF-16 units
- What it breaks
- The month-length check that most hand-written validators skip.
- What a correct application does
- Rejected, not rolled over into December.
Day and month in an ambiguous order
dates-impossible/ambiguous-day-month
03/04/2026
03/04/2026
- 10 graphemes
- 10 code points
- 10 bytes
- 10 UTF-16 units
- What it breaks
- The same text means March or April depending on convention, and nothing on screen says which was assumed.
- What a correct application does
- The expected order stated next to the field, or an unambiguous format enforced.
ISO 8601 date
dates-impossible/iso-format
2026-09-06
2026-09-06
- 10 graphemes
- 10 code points
- 10 bytes
- 10 UTF-16 units
- What it breaks
- A field expecting a local format receives the international one, and vice versa; both are legitimate user input.
- What a correct application does
- Both accepted, or one enforced with a visible example.
Year 9999
dates-impossible/year-9999
31.12.9999
31.12.9999
- 10 graphemes
- 10 code points
- 10 bytes
- 10 UTF-16 units
- What it breaks
- The upper end of most date types; often accepted by the interface and rejected by storage.
- What a correct application does
- The same range enforced on both sides.
Year 0000
dates-impossible/year-0000
01.01.0000
01.01.0000
- 10 graphemes
- 10 code points
- 10 bytes
- 10 UTF-16 units
- What it breaks
- Below the range of several date types, and the year zero does not exist in the common calendar.
- What a correct application does
- Rejected with a stated range.
Five-digit year
dates-impossible/year-10000
01.01.10000
01.01.10000
- 11 graphemes
- 11 code points
- 11 bytes
- 11 UTF-16 units
- What it breaks
- Five-digit years break fixed-width parsing and column formats without producing an obvious error.
- What a correct application does
- Rejected with a stated range.
Unix epoch
dates-impossible/epoch-zero
01.01.1970
01.01.1970
- 10 graphemes
- 10 code points
- 10 bytes
- 10 UTF-16 units
- What it breaks
- The zero point of the most common timestamp representation; frequently indistinguishable from "no date set".
- What a correct application does
- Stored and displayed as a real date, distinct from an empty field.
Negative timestamp
dates-impossible/negative-timestamp
-1
-1
- 2 graphemes
- 2 code points
- 2 bytes
- 2 UTF-16 units
- What it breaks
- Dates before the epoch are negative in many representations and are silently rejected or wrapped.
- What a correct application does
- Handled as an ordinary past date, or rejected with the supported range stated.
A date in words
dates-impossible/date-in-words
tomorrow
tomorrow
- 8 graphemes
- 8 code points
- 8 bytes
- 8 UTF-16 units
- What it breaks
- Text in a date field: accepted by lenient parsers, which then produce a different date every day.
- What a correct application does
- Rejected - natural-language dates belong to a deliberate feature, not to a parser's leniency.
Slashes instead of dots
dates-impossible/dots-vs-slashes
06/09/2026
06/09/2026
- 10 graphemes
- 10 code points
- 10 bytes
- 10 UTF-16 units
- What it breaks
- The same date in another separator; forms often accept one and store the other without saying so.
- What a correct application does
- Accepted in both, normalised once, and shown in one consistent form.