This post draws on a customer support question, from back when DEC (Digital Equipment Corp) was the second largest company in the computer industry.
The question was,
Why is Wednesday, November 17, 1858 the base time for VAX/VMS?
When you know the answer, you will have a valuable new trick in your bag of programming tricks.
So what's a VAX/VMS?
VAX was a family of computers manufactured by DEC.
VMS is the legendary OS, released in 1977, also a product of DEC ingenuity, that is still the subject of much study and emulation.
OK, enough about ancient computers, let's check out some real ancient history!
The answer is related to the Julian Period and the Julian Day
The Julian day (JD) is simply the number of days since noon January 1, 4713 B.C., which was the the beginning of the most recent Julian Period.
Today, , is JD (at noon plus or minus a fraction to account for the time of day).

This all comes from scholar and historian Joseph Scaliger who was active when the Gregorian calendar replaced the Julian calendar in 1582.
Just one year later Scaliger recognized a need to reconcile all the various calendars (Roman Julian Gregorian, Hebrew, etc) used throughout history.
His concept of an "absolute date" has stuck even to today, especially among astronomers (and digital historians like myself). To compute astronomical positions of stars, planets, etc. one begins by calculating the Julian day.
His proposal was to define the Julian period as the product of three pervasive calendar cycles, then assign the base date to the last time they all were at the beginning of respective cycles on the same date.
The three cycles are
- 28 year Solar Cycle
- 19 year Lunar Cycle
- 15 year Indiction Cycle
The last time they were all at the beginning of their cycles was at noon on January 1, 4713 B.C. — the beginning of the Julian Period.
This date was before any historical event known to him, even the Hebrew calendar marks the beginning of the world as 3761 B.C.
OK, I understand 4713 B.C. — but why 1858?
It comes down to computer memory limitations back in the late 1950's.
1957 was a big year...
DEC was founded by two guys from MIT in 1957, the very same year that the Soviets launched Sputnik 1 — the first artificial satellite in the world to be put into outer space — starting of the space race.
It was also the year that the Smithsonian Astrophysical Observatory (SAO) adopted the Modified Julian Day for tracking satellites with their 8K (non-virtual) 36-bit IBM 704 computer.
So why 1858? The Julian Day 2,400,000 just happens to be November 17, 1858. The Modified Julian Day uses the following formula:
MJD = JD - 2,400,000.5
Today is therefor MJD (at midnight plus a fraction to account for the time of day).
The .5 changed when the day starts. Astronomers in Scaliger's time had considered it more convenient to have their day start at noon so that nighttime observations would fall within one day. Modern astronomers have changed to conform to the commercial day.
But for the SOA the big issue was to fit the day number as well as the time of day within a single 36-bit word on their computer: Remember they had only 8K of memory total!
18 bits — half of a word — provided enough accuracy for the time of day and by going with the MJD they could encode the day number into the other half-word. This would not be possible with the JD which is currently 22 bits long.
This would work for about 717 years from 1858 at the expense of not being able to track dates before this. Or they could go with 1858 plus or minus about 3 centuries.
Since the year 1858 preceded the oldest star catalog in use at SAO, they opted for the former.
This base time of Nov. 17, 1858 was subsequently used by several DEC systems including the VAX/VMS.
It's a One-Liner of Code!
If you are an astronomer, you may be familiar with all this, but did you know that there is an algorithm to calculate the Julian Day in just one or two lines of code (depending on the language)?
Here's the algebraic formula given month (1 = January), day of month (also one based), and four digit year:
jd = 367y + 7[y + (m+9)/12]/4 - 3{[y + (m-9)/7]/100 + 1}/4 + (275m)/9 + d + 1721028.5
This works for any date in the Gregorian Calendar (i.e. the modern calendar), but there are a couple of gotchas:
- Every division must truncate any decimal part — In javascript, that means
every division must be wrapped in a
Math.floor()
call - Actually, the day starts at noon and parts of the day are represented as decimals. But, in my experience, it works well to store dates only (as integer or big integer) and store the time in another field if needed.