Skip to content

Commit

Permalink
Explicitly disallow year 0
Browse files Browse the repository at this point in the history
Year "0" doesn't exist; it goes from 1 BC to 1 AD.

RFC 3339 is somewhat unclear if this should be allowed, at least in my
reading of it:

> This document defines a [..] representation of dates and times using
> the Gregorian calendar.

"Gregorian calendar" has no "year zero", so it should be forbidden. But
also:

> All dates and times are assumed to be in the "current era",
> somewhere between 0000AD and 9999AD.

So meh.

Practically speaking, supporting this across the board is rather tricky.
Python's datetime has no way to represent this (other than None, maybe?
Ugh.), PostgreSQL doesn't support it, Go's time.Time behaves oddly (e.g.
IsZero() is false, which is rather surprising), etc.

ISO 8601 defines year 0 as "1 BC", which is even worse since most
datetime implementations don't really do BC dates.

Just forbidding it is by far the easiest for everyone; for
implementations with a datetime that supports it, it's just a single
`if`, and for e.g. Python nothing needs to be done.

The only potential downside is that people may have `d = 0000-01-01`. We
already broke compatibility "for sanity" by disallowing table overrides.
The alternative is making it implementation-dependent. Meh.

RFC 3339 is supposed to be a "ISO 8601, without obscure edge cases";
this seems to fit with the intended purpose.
  • Loading branch information
arp242 committed Oct 13, 2023
1 parent 23c3fb7 commit 739a0fd
Show file tree
Hide file tree
Showing 3 changed files with 9 additions and 1 deletion.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
- Seconds in Date-Time and Time values are now optional.
- Allow non-English scripts in unquoted (bare) keys
- Clarify newline normalization in multi-line literal strings.
- Explicitly disallow year zero.

## 1.0.0 / 2021-01-11

Expand Down
2 changes: 1 addition & 1 deletion toml.abnf
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,7 @@ false = %x66.61.6C.73.65 ; false

date-time = offset-date-time / local-date-time / local-date / local-time

date-fullyear = 4DIGIT
date-fullyear = 4DIGIT ; 0001-9999
date-month = 2DIGIT ; 01-12
date-mday = 2DIGIT ; 01-28, 01-29, 01-30, 01-31 based on month/year
time-delim = "T" / %x20 ; T, t, or space
Expand Down
7 changes: 7 additions & 0 deletions toml.md
Original file line number Diff line number Diff line change
Expand Up @@ -582,6 +582,13 @@ implementation-specific. If the value contains greater precision than the
implementation can support, the additional precision must be truncated, not
rounded.

The first year in the Gregorian calendar is year 1 (1 BC is followed by 1 AD),
and year 0 is not allowed:

```
odt7 = 0000-01-01 07:32:32Z # INVALID
```

## Local Date-Time

If you omit the offset from an [RFC 3339](https://tools.ietf.org/html/rfc3339)
Expand Down

0 comments on commit 739a0fd

Please sign in to comment.