public
Last active

The fun of implementing date support

  • Download Gist
gistfile1.txt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
After spending the better part of the month implementing date support
in RethinkDB, Mike Lucy sent the team the following e-mail. It would
have been funny, if it didn't cause thousands of programmers so much
pain. Read it, laugh, and weep!
 
-----
 
So, it turns out that we're only going to support dates between the
year 1400 and the year 10000 (inclusive), because that's what boost
supports.
 
Now, I know all you date-time fans out there have the same question --
"1400? How does that make any sense? Wasn't the Gregorian calendar
established some time in the 1500s?"
 
Great question! It turns out that it's the wrong one, though. See,
they didn't really have standards bodies or anything back in the day
-- there was nobody to "establish" a calendar. The Catholic church
came up with the Gregorian calendar in 1582 because the Julian date of
Easter as decreed by the first council of Nicaea had drifted from the
actual date of the Spring equinox. (The Julian calendar loses about
18 hours every century.)
 
So Catholic countries switched to the Gregorian calendar in 1582, by
just picking a day and skipping about 10 days forward. (Of course,
they all picked different days to skip forward, so there's a period of
time toward the end of 1582 where if you pick a random day there's a
pretty good chance that that day doesn't exist in at least one major
European country.)
 
The Protestant countries took just a tad longer -- about 120 years.
Most of them switched over around 1700, with varying degrees of
Hijinks.
 
Sweden deserves a special mention here, because they apparently
decided that rather than skipping so many days, it would be easier to
just not have leap years for a while until they caught up with the
Gregorian calendar. That sounds reasonable, until you think about it
and realize that they planned to spend 40 YEARS where their own notion
of the current date didn't line up with either calendar.
 
And then, best of all, they didn't even do it. They skipped the first
leap year, then got into some war or another and just didn't bother
skipping the next two.
 
They finally realized that the whole idea was sort of silly (after 12
years, 8 of which were spent not doing it). However, instead of just
jumping forward like everyone else, they moved BACK to the Julian
calendar by introducing February 30th for the year 1712. (This is the
only year where February 30th is a legal Julian date, and only in
Sweden.)
 
50 years later, they finally jumped forward to Gregorian like
everybody else (at approximately the same time as Britain).
 
Lest you think that this is all a relic of history, Alaska didn't move
onto the Gregorian calendar until we bought it from Russia in the late
1800s, and Russia itself didn't move onto the Gregorian calendar until
1918.
 
China actually moved onto the Gregorian calendar TWICE -- once in
1912, and once in 1928. (In between there was a brief period of chaos
where several warlords rejected the Gregorian calendar in favor of
whatever one they liked best.)
 
Now, though, everyone is basically settled on the Gregorian calendar,
except for a few countries (like Iran) that reject it, or (like
Israel) use it alongside another calendar, or (like Taiwan) use it but
with minor edits.
 
But let's ignore those. Let's say we're in a country X that's on the
Gregorian calendar, and we have a date that we know was recorded
*after* the last time X moved to the Gregorian calendar (we need "the
last time" for cases like China). Then we should be safe, right?
 
Not quite. You see, while we take it for granted now, the year didn't
always start on January 1st. Many European countries started the year
on some major holy day (like Christmas). Some, like England, even had
multiple starts of the year; one that was in common use, and one that
was the legal standard.
 
Now most countries switched to starting their years on January 1st
before adopting the Gregorian calendar, but some didn't. Holland, for
example (then the Republic of the Seven United Netherlands -- don't
even get me STARTED on all the cases where groups with different
calendars conquered each other, or merged with each other, or began or
ceased to exist). They apparently didn't move to January 1st until a
year after they'd moved to the Gregorian calendar.
 
Anyway, that's all I've got for you. No moral.

Stupid dates. They are a pain on everyone. But mostly just programmers.

Nice write up, thanks for sharing!

We should have a world government and a time schedule made by programmers. And converters for deprecated calendars.

The only valid unit of time is a heartbeat.

@NSElvis, I'm sure each person's heartbeat is slightly different.

There is a moral:

  1. Store timestamps for computers and developers as either RFC3339/ISO8601 or time_t. Both boil down to representing seconds ± an epoch, as even the ostensibly human-parseable string algorithmically extends the Gregorian calendar to all time.
  2. Display timestamps for humans using the calendar support in the best localization library you have available.

Yes, this doesn't solve every theoretical problem: there are subtly varying ways of defining "seconds ± an epoch" and localization requires a concern for usability. The point is we already have what @Akku is asking for: sane and useful and standardized options for representing time along a simple number line (what programmers want), and converters from this pure ideal into the "deprecated" messiness of how people prefer to communicate in real life (what users deserve).

Why is this not a Wikipedia article? :)

+1 on @brandongalbraith comment. It should be a Wikipedia article, or part of one about dates.

@brandongalbraith, @chronossc -- Most of the information in there is cribbed from http://en.wikipedia.org/wiki/Gregorian_calendar , or else from more specific pages like http://en.wikipedia.org/wiki/Swedish_calendar or http://en.wikipedia.org/wiki/Dutch_Republic .

Interestingly, the Russian shooting team missed competing in the 1908 Olympics since they were following the "wrong" calendar. I've added that info on a fork at https://gist.github.com/dickfeynman/6178581 but dunno how to submit a pull request.

While Russia did change to the Gregorian calendar in 1918, they changed it to the Soviet calendar in 1929, but reverted in 1940. During the French Revolution, France used a Metric inspired calendar until 1805, when they went back to the Gregorian calendar. It was briefly reimplemented in 1871, during the Paris Commune. Both these calendars were based on a simplification of the months (both used 30 days for each month), which required some 'complementary days', that were added at the end of the year.

When Romulus (or so legend tells us) created the first Roman Calendar, there were no January and February (they were added by King Noma), hence why the year - according to Roman tradition - starts 1 March. Caesar was 15 days (ides) into the year's session when he was killed. I'd also like to point out that it is the 24th and not the 29th of February that is the leap day. In fact, originally, it was not a leap day, but a leap month, inserted near the end of February, called Mensis Intercalaris.[0] I realise the old Roman calendar might be a bit before the Gregorian calendar, but let's not forget that the Gregorian calendar is based on those.

In North Korea, while they use the Gregorian calendar, they do not use the regular reckoning, and all years are according to Kim Il-Song's birth year (that is, 1912). This is known as the Juche calendar. However, Gregorian years often appear after the Juche calendar year in official documents.

[0] I personally find this a bit unfair, as consuls served each month alternating for a year. So on leap years, you just get an extra month to govern of the other guy.

Bravo for implementing this :)

Please sign in to comment on this gist.

Something went wrong with that request. Please try again.