Calendars, Time & Bugs: Y2K, Y2004, Y2038, Y2106, Y4K

The impending y2k20 crisis in 2020

 Browsers in 2020 will expect to "connect HTTPS" only using TLSv1.2 and TLSv1.3 (this assumes that support for everything from SSLv3 to TLSv1.1 will be removed)

While browsers are constantly being updated because of their financial use in everything from on-line purchases to on-line investing and banking, many web servers are not. What is worse it this: many organizations, including governments large and small, are slow to update software

comment: Firefox has been warning for several months (today is 2019-08-25) that one of my servers is preferentially offering connections via TLS-1.0 (the lock icon is closed but is orange). Chrome and IE11 each present a green lock icon.

Overview of y2k (2000)  vs. y2k20 (2000)

Why is 2020 going to be a problem?

Daylight Savings Time + UTC (Universal Time Coordinated)

Indian Wisdom

Before the age of internet connectivity, computers were set to the local time of their operators. When the local time zone would change between Standard Time and Daylight Savings Time, either the computer clock was changed on the fly (on systems that allowed it), or it was changed during a reboot. These two methods have short comings which became more apparent after computers were connected to the outside world for the following reasons:

It is for the above reasons that some computer operating systems (like all modern Unix and Linux platforms) allow for easy synchronization to a world standard known as UTC (Universal Time Coordinated). This is similar to, but not exactly the same as, GMT (Greenwich Mean Time). When properly implemented, file creation and modification dates are stamped in a UTC time format. Also, the system clock no longer changes twice a year but user processes could display a shifted "local view" if desired.

Solaris (a flavor of Unix created by SUN Microsystems)

NTP (Network Time Protocol)

Like Telnet, FTP and HTTP, NTP is an Internet service that has recently started to enjoy an increased popularity, at least it has with the techies. Basically NTP works something like this...

Caveat: a block diagram used to be here. It was created before Wikipedia existed. Click the next link here for a better description and diagrams

VAX/VMS System Time

Caveat: most of this stuff is not relevant to OpenVMS-Alpha or OpenVMS-Itanium

TOY (Time-Of-Year Clock)

Info derived from P.254 of:
Version 4.4 VAX/VMS Internals and Data Structures
(c) 1988 by Digital Equipment Corporation.

TOY Clock Notes:

Table Legend:

TOYCPR Time Of Year Clock In Processor Register
TOYCC Time Of Year Clock In Console
WC Watch Chip
BB Battery Backup

Processor TOYCC? TOYCPR? WC?
MicroVAX I N N N
VAX-11/730 N Y opt BB N


Info derived from P.255-256 of:
    Version 4.4 VAX/VMS Internals and Data Structures
    (c) 1988 by Digital Equipment Corporation.
When a non VAXcluster VAX/VMS system is booting, SYSINIT runs routine EXE$INIT_TODR to check the contents of the Time-Of-Year (TOY) Clock to see if it contains a value greater than hex $10000000. When the system is either started up or shut down, the $SETIME routine is called to make sure that both the Time-Of-Year Clock and the associated date entry in the system image file (SYS$SYSTEM:SYS.EXE) are accurate. When the value in the Time-Of-Year Clock is too large, its contents are lowered by one year while the stored value of the system image file are increased by a year.

What's up with "November 17, 1858" ?

PRODUCTS:   OpenVMS VAX, All Versions
            OpenVMS Alpha, All Versions
            VAX VMS, All Versions

COMPONENT:  System Time

SOURCE:     Digital Equipment Corporation


Why is Wednesday, November 17, 1858 the base time for OpenVMS (VAX VMS)?


November 17, 1858 is the base of the Modified Julian Day system.

The original Julian Day (JD) is used by astronomers and expressed in
days since noon January 1, 4713 B.C.  This measure of time was
introduced by Joseph Scaliger in the 16th century.  It is named in
honor of his father, Julius Caesar Scaliger (note that this Julian Day
is different from the Julian calendar named for the Roman Emperor
Julius Caesar!).

Why 4713 BC?  Scaliger traced three time cycles and found that they
were all in the first year of their cyle in 4713 B.C.  The three
cycles are 15, 19, and 28 years long.  By multiplying these three
numbers (15 * 19 * 28 = 7980), he was able to represent any date from
4713 B.C. through 3267 A.D.  The starting year was before any
historical event known to him.  In fact, the Jewish calendar marks the
start of the world as 3761 B.C.  Today his numbering scheme is still
used by astronomers to avoid the difficulties of converting the months
of different calendars in use during different eras.

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

The .5 changed when the day starts.  Astronomers had considered it
more convenient to have their day start at noon so that nighttime
observation times fall in the middle.  But they changed to conform to
the commercial day.

The Modified Julian Day was adopted by the Smithsonian Astrophysical
Observatory (SAO) in 1957 for satellite tracking.  SAO started
tracking satellites with an 8K (non-virtual) 36-bit IBM[R] 704 computer
in 1957, when Sputnik was launched.  The Julian day was 2,435,839 on
January 1, 1957.  This is 11,225,377 in octal notation, which was too
big to fit into an 18-bit field (half of the IBM standard 36-bit word).
And, with only 8K of memory, no one wanted to waste the 14 bits left
over by keeping the Julian Day in its own 36-bit word.  However, they
also needed to track hours and minutes, for which 18 bits gave enough
accuracy.  So, they decided to keep the number of days in the left 18
bits and the hours and minutes in the right 18 bits of a word.

Eighteen bits would allow the Modified Julian Day (the SAO day) to
grow as large as 262,143 ((2 ** 18) - 1).  From Nov. 17, 1858, this
allowed for seven centuries.  Using only 17 bits, the date could
possibly grow only as large as 131,071, but this still covers 3
centuries, as well as leaving the possibility of representing negative
time.  The year 1858 preceded the oldest star catalog in use at SAO,
which also avoided having to use negative time in any of the satellite
tracking calculations.

This base time of Nov. 17, 1858 has since been used by TOPS-10,
TOPS-20, and VAX VMS and OpenVMS.  Given this base date, the 100
nanosecond granularity implemented within OpenVMS and the 63-bit
absolute time representation (the sign bit must be clear), OpenVMS
should have no trouble with time until:

     31-JUL-31086 02:48:05.47

At this time, all clocks and time-keeping operations in OpenVMS will
suddenly stop, as system time values go negative.

Note that the OpenVMS time display and manipulation routines allow for
only 4 digits in the 'YEAR' field.  We expect this to be corrected in
a future release of OpenVMS sometime prior to 31-DEC-9999.

Calendar Evolution

Calendar Kinds - a 10,000 foot (3 km) view

Lunar Calendars

Many ancient peoples, including Babylonians, Jews, Muslims, and Chinese, based their calendars upon the cycles of the moon. Some problems with lunar calendars include:
  1. the true year (the length of time required for the Earth to orbit the Sun) is not a whole number of lunar months. A 12 month lunar year is too short while a 13 month lunar year is too long.
  2. the lunar orbit around the Earth is elliptical rather than circular (and the ellipse orbits slowly over the course of ~ 19 years)
By the way, the word Month comes from the word Moon (e.g. "Moonth")

Solar Calendars (or more correctly, Solar-Lunar Calendars)

Other cultures, such as the Egyptians, based their calendars on the cycles of the sun. The problem with ancient solar calendars is that the true year is not a whole number of days.

Click here to examine four popular calendars (two lunar, two solar)

Egypt ~ 4231-2773 BC

Ancient Egyptians began numbering their years when the Sirius (the dog star) rose at the same place as the Sun. The Egyptian calendar was the first solar calendar and contained 365 days. These were divided into twelve 30-day months followed by five days of festival. From astronomical calculations, Sirius and the Sun coincided in 4241 BC and 2773 BC, so either of these could have served as Egyptian Year 1.

Greece ~ 440 BC

The calendar used by the ancient Greeks was based on the Moon, and is known as the Metonic calendar. This calendar was based on the observations of Meton of Athens (ca. 440 BC), who showed that 235 lunar months made up almost exactly 19 solar years. This 19-year cycle became known as the Metonic Cycle. However, given a nominal twelve-month year, and additional lunar months needed to be added to synchronize the cycle. These were added in years 3, 5, 8, 11, 13, 16, and 19 of the cycle. (note: year gap sizes are: 2-3-3-2-3-3)

Greece ~ 325 BC

Around 325 BC, Callippus modified the calendar by noting that four 19-year Metonic cycles with 940 months were very close to 27,759 days. This is called the Callipic Cycle. Hipparchus noted that an even more accurate cycle (now called the Hipparchic Cycle) consisted of four Callipic Cycles less a day, in which ((4 x 27759)-1) days were very nearly 3760 months. However, neither system was widely used. A lunar-based calendar is still used by some religious sects to determine holidays. Easter, for instance, generally occurs on the first Sunday following the first Full Moon after the Vernal Equinox, although the actual scheme is a bit more complicated still (Montes).

Greece ~ 200 BC

In 1901, a planetarium-calendar device, now called the Antikythera Mechanism, was recovered from a Roman shipwreck circa 65 BC off the Greek island of Antikythera. It is believed to have been designed by either Hipparchus (190-120 BC) or Archimedes (287-212 BC). By turning a handle, three displays are put into motion.
  1. Single Dial Side
  2. Dual Dial Side
    1. Calendar:
      • Displays 235 lunar months over 19 years
      • The Callippic Dial is the left secondary upper dial, which follows a 76-year cycle, quadrupling the Metonic dial
      •  The Olympiad Dial is the right secondary upper dial for determining the dates of the Olympic games
    2. Eclipse Predictor: both lunar and solar

The Pragma of Rome

Rome - 753 BC

Ancient Rome's calendar was neither lunar or solar, it was agricultural. It consisted of ten lunar months, beginning with the spring moon in March and ending 304 days later in December (the tenth month). The period between December and March was disregarded since no agricultural activity was possible during those 60 winter days. In keeping with an ancient custom, each month was divided into three sections known as Kalends, Nones and Ides, each of different lengths. The word Kalends, meaning a "calling" or announcement of a new month, gave us the word calendar. The Nones was nine days before the Ides. Since this Romans used inclusive counting, this day was always on the 5th or 7th of the month. The start of the calendar was chosen every year so that the Ides (either the 13 or 15 day) of each month would always land on a full moon. Months in this calendar consisted of only odd numbered days (29 or 31) because superstitious Romans tended to avoid even numbers whenever possible.

Rome - 304 BC

Proposed by Numa Pompilius (reign 715-673 BC) but not published until 304 BC (this date is in dispute), the number of months was increased from ten to twelve by adding January and February. (January comes from the two faced god Janus who simultaneous looks ahead and back). The months were still lunar in character, their lengths alternating between 29 and 30 days. This gave the year 354 days but as the total was an even number and to the Romans this was unlucky, an extra 355th day was added at the end of the year. After being advised by his astronomers that the extra 355th day would not be sufficient to agree with the seasons which were important to both agriculture and military operations, Numa inserted an additional thirteenth month every two years, calling it Mercedonius (from the Latin word for wages, indicating that it meant extra remuneration). This "remunerative" month of 22 or 23 days was arbitrarily thrust into the calendar toward the end of February, after the 23rd, when the newly inserted month began. When it was finished, the remaining five or six days of February carried on. Of all the complicated man-made calendar adjustments in history, this was certainly the most fantastic.

Rome - 45 BC (the calendar moves to 365.25 days)

Proposed by Julius Caesar in 45 BC and slightly modified thereafter by Caesar Augustus, this calendar agrees with the Egyptian solar calendar and even implements a leap year (by adding an extra day to February) every 4 years so the calendar is synchronized with the heavens (almost). The months of Quintilis (fifth) and Sextilis (sixth) were renamed to July (after Julius who was born in that month) and August (after Augustus). January was made the first month so August would become the 8th month (because Augustus' given name was Octavian). This is why September (sept=7) through to December (dec=10) appear to be misnamed. 

Solar Calendar Before Julius Caesar
(requires a leap month every two years;
February is smaller at this time)

 Martius    (March    )
 Aprilis    (April    )
 Maius      (May      )
 Junius     (June     )
 Quintilis  (July     )
 Sextilis   (August   )
  7th month (September)
  8th month (October  )
  9th month (November )
 10th month (December )
 11th month (January  )
 12th month (February )
Mercedonius (wages    )

 31 days
 29 days
 31 days
 29 days
 31 days
 29 days
 29 days
 31 days
 29 days
 29 days
 29 days
366 days

Solar Calendar After Julius Caesar
(requires a leap day in every fourth

 Martius    (March    )
 Aprilis    (April    )
 Maius      (May      )
 Junius     (June     )
 Julius     (July     )
 Augustus   (August   )
  9th month (September)
 10th month (October  )
 11th month (November )
 12th month (December )
  1st month (January  )
  2nd month (February )

    31 days
    30 days
    31 days
    30 days
    31 days
    31 days
    30 days
    31 days
    30 days
    31 days
    31 days
 1+ 28 days
365.25 days

Nicaea - 325 AD

Easter was originally linked to Passover, but in the year 325 AD, the council at Nicaea (under the Roman emperor Constantine) decided that Easter would be celebrated on the first Sunday following the first full moon, on or after the vernal equinox (the passing from winter into spring). In the year 325 AD, the vernal equinox was assumed to be fixed at March 21.

Rome - 523 AD (years change from AUC to AD)

At this time it was customary to count years since the founding of Rome (ab urbe condita or AUC) and "the church was using an Easter calculation algorithm which was about to come to an end". Around 523 AD, the papal chancellor, Bonifatius, asked monk Dionysius Exiguus (Denis the Little) to devise a new method to calculate Easter.  Information from many sources seem to indicate that Dionysius was aware that a 532 year variation 1 of the Metonic Cycle was conveniently restarted near the birth of Christ. Since only pagan cultures celebrated birthdays, Dionysius Exiguus was more concerned with the mathematical beauty of the Metonic Cycle than determining the birthdate of Jesus Christ. So his main claim to fame was to change the numbering of years from AUC to a date near the birth date of Jesus Christ (Anno Domini, "in the year of our Lord") only for the purposes of publishing a new Easter algorithm.
  1. The variation of the Metonic Cycle works like this:

    1. 19 years (the Metonic Cycle)
    2. 4 years (the Callipic Cycle helps to account for leap years)
    3. 7 days in a week (Easter must fall on a Sunday)

      532 years = 19 x 4 x 7
    The beginning of this cycle falls on January 754 AUC which Dionysius renamed to 1 AD ("anno domini" meaning "year of our Lord").
  2. According to the Gospel of Luke (3:1 & 3:23) Jesus was "about thirty years old" shortly after "the fifteenth year of the reign of Tiberius Caesar". Tiberius became emperor in AD 14. If you combine these numbers you reach a birth year for Jesus that is strikingly close to the beginning of our year reckoning. This may have been the basis by Dionysius' argument. (on the flip side, the Gospel of Luke mentions a Roman Census which historical records say is the Census of Quirinius which occurred in 6/7 AD).

  3. The Gospel of Matthew tells us that Jesus was born under the reign of king Herod the Great
    Since Herod died in 4 BC. It is likely that Jesus was actually born between 5 BC and 7 BC.

  4. Today it is commonly believed that Dionysius made a mistake in determining the exact date of Christ's birth but this was not his intention. In 523 only pagans celebrated birthdays meaning that those Christians had no intention of celebrating Christ's birth.

Rome - 1582 AD (the calendar moves to ~ 365.2425 days)

Neapolitan astronomer Aloysius Lilius noticed that the Julian calendar (which had a leap year every 4 years) was too long by almost 11 minutes per year which translated into a discrepancy of approximately 9.5 days by the year 1582. In order to make the calendar synchronize with the heavens, he suggested that centuries which are evenly divisible by 100 should not be leap years except those which are evenly divisible by 400.

Easter was originally linked to Passover, but in the year 325 AD at the council at Nicaea, it was decided that Easter would be celebrated on the first Sunday following the first full moon on, or after, the vernal equinox (the passing from winter into spring). In the year 325, the vernal equinox was assumed to be fixed at March 21.

Due to inaccuracies in the calendar, by the 16th century the vernal equinox was occurring on March 11. This caused problems for the church in Rome because most Christians outside of Rome were using the date "March 21" to calculate the day of Easter rather than the "vernal equinox" event. (sometimes bad weather combined with a lack of local astronomers made "the calendar option" the only choice). This had the effect of pushing the day of Easter celebration closer to the summer months.

Pope Gregory XIII assigned the problem to a Jesuit astronomer named Christopher Schlussel (a.k.a. Clavius) who suggested that the Easter/equinox problem could be solved by removing 10 days from the current year (shifting the vernal equinox back to March 21) but from that time forward the Christian world should adopt the idea proposed by Aloysius Lilius. The plan was approved by Pope Gregory approved the plan in 1582 and decreed that October 4 was followed by October 15. The peasants revolted thinking that their lives had been shortened by that much. The new calendar was named the Gregorian Calendar after the pope who approved the changes.

This so-called "continental calendar" wasn't adopted by England, or its colonies including America, until 1752. At that time, 11 days needed to be removed. (10 for the original correction, 1 for the century following)


  1. The Earth requires 365.2425 mean solar days (averaged over 4 years) for one revolution around the sun, not 365.25 as is commonly believed
  2. This difference translates into ~ 648 seconds per year which needed to be removed to correct for Easter as defined in 325 AD
  3. Computations:
Year 2 Year 1 difference
(in years)
approximate error
seconds per year
approximate total
error seconds
equivalent days
(86400 secs/day)
a 1582 AD 325 AD 1257 648 814536 9.4275
b 1752 AD 325 AD 1427 648 924696 10.7025

Computer Calendar Bugs

Year 2000 Problem (a.k.a.Y2K Problem)

Part 1: Short Field Storage (a.k.a. lazy programming)

God hits the RESET button (but the problem was really caused by man)
God hits the RESET button.
(but the problem was caused by man)
When dealing with dates, many programmers decided to only code for, and store, the least two significant digits of the year. This started with early mainframe programmers (1950s-1970s) who only had 80 columns of storage on each punched card. This tradition was continued on minicomputers (1970s-1980s) and PCs because memory and storage were still very expensive. There is no need to do this now.

Fact: In 1989 a woman in who was born in 1884 was placed on a Kindergarten enrollment list because her 2-digit birthday (89) indicated that she was 5 years old.

Imagine the problems on January 1, 2000 when automated programs...

  1. decide to purge seemingly stale records
  2. decide to compute negative interest values
  3. decide to lock-out seemingly expired credit cards?
Other Stuff (cheap vs. lazy)

Although most currently supported operating system software has been fixed, much application software, and firmware associated with old harware, are still broken. Unsupported software (like MS-DOS) and obsolete firmware (like PC BIOS before 1995) will probably never be fixed. Furthermore, application software that makes direct BIOS calls to check the date instead of calling a similar routine in the operating system is at great risk since the application software will only fail on certain platforms.

If (for productivity reasons) your users only enter 2 digit years, programmers should translate these dates to 4 digits for storage. Failure to do this means this problem will be back in the year 2100. 

Part 2: Is 2000 AD a Leap Year? (Yes)

Leap Year
Rule Name
Description Remark
1 divide by 4 If a year is evenly divisible by 004, then that year is a leap year.
Using this rule, 2000 AD is a leap year.
Everyone knows this rule
2 divide by 100 If a year is evenly divisible by 100, then that year is not a leap year.
Using this rule, 2000 AD is not a leap year.
Many people seem to
know this exception
3 divide by 400 If a year is evenly divisible by 400, then that year is a leap year.
Using this rule, 2000 AD is a leap year (which is true).
Few people seem to know this
exception to the exception
4 divide by 4000 If a year is evenly divisible by 4000, then that year is not a leap year Proposed

Y2004 Problem

Some Unix systems and some "C" programs will hit a wall on Saturday 2004-01-10. The reason for this is the fact that these 32 bit clocks record the number of seconds that have elapsed since 1970-01-01 (start of the Unix epoch). In some instances vendors only used 29 bits which means that we will experience (2^30 = 1,073,741,824 seconds) ~34.025 years of range before we overflow.


Y2010 Problem

It's only 10 years since Y2K and some bozo programmers didn't learn the lesson. Now we've got problems with portable devices running WindowsCE along with other stuff.


Y2038 Problem (and Y2106 Problem)

Many Unix systems and C/C++ programs using the "time_t" or "time_b" structures will hit a wall on Monday 2038-01-18. The reason for this is the fact that these 32 bit clocks record the number of seconds that have elapsed since 1970-01-01 (start of the Unix epoch).

  1. If the 32-bit clock location was treated as a signed integer, then there are only (2^31 = 2,147,483,648 seconds) ~68.051 years of range before we overflow. 1970 + 68 = 2038. BTW, the exact rollover date is: 3:14:08 AM (GMT) on January 19, 2038
  2. If the 32-bit clock location was treated as an unsigned integer, then there are only (2^32 = 4,294,967,296 seconds) ~136.103 years of range before we overflow. 1970 + 136 = 2106.
  1. I am convinced that "C" libraries and related OS calls will be modified to either 32-bit unsigned or 64-bit before 2038. According to this article, Linux already has fixed this problem which is probably one reason why Linux is found in the datacenters of most banks and insurance companies.
  2. I wonder how much embedded "C" software will still be working in bank machines, credit card readers, and PC BIOS firmware?

Y4K Problem?

It was suggested by the astronomer John Herschel (1792-1871) among others, that a better approximation to the length of the tropical year would be 365 x 969 / 4000 days = 365.24225 days. This would dictate 969 leap years every 4000 years, rather than the 970 leap years mandated by the Gregorian calendar. This could be achieved by dropping one leap year from the Gregorian calendar every 4000 years, which would make years divisible by 4000 non-leap years. This rule has, however, not been officially adopted.

Programmer's Summary:
  1. Never take chances. Always call operating system routines rather than doing the date calculations yourself. The operating system software designers have consulting astronomers on staff to assist in this sort of thing. They will almost always do a better job of this stuff than the little guy.
  2. BIOS routines are written in firmware. Operating Systems are written in software. Since the BIOS routines may be broken but the operating system may be fixed, never call the BIOS directly, Always call the operating system routines.
Advice to System Managers and System Operators:

For some reason, it is currently considered COOL to make one the following statements... What many people fail to realize is that, in most cases, new software can make up for inadequate hardware. Whenever possible, 32-bit Windows will replace calls to 16-bit BIOS routines with 32-bit alternatives. The routine for your clock chip can also be replaced but only if you have installed new OS software.

Date/Time Stamps (and displays)

How many times have you seen a date of the form 5/10/97 and thought to yourself "is that May 10th or October 5th?". It seems that Americans prefer mm/dd/yy while Brits prefer dd/mm/yy and the remainder of Europe prefers yy/mm/dd. Canadians are so confused they'll use anything. Does anyone know what this 05/06/07 means?

IMHO, the whole world should start to use a variation of the metric format ISO-8601 (sometimes called Star Trek Time) which has the following rules:
1. the most significant field (year) appears first while the least significant field (day) appears last. Similar to the odometer in your car.

2. By removing any slashes, everyone will automatically know which time format is being used. The lack of slashes will also allow the string to be used in computer file names. Some computer file systems (Unix) will allow more than one period in the file name.

3. Leading zeros must always be used to pad fields (e.g. month must be 05 not just 5)
Here are a few examples for May 10th, 1997:

Format #1: (Recommended)

  970510           (should only be used on print outs)
19970510           (can also be used internally      )
  970510.2359      (should only be used on print outs)
19970510.2359      (can also be used internally      )
  970510.235959    (should only be used on print outs)
19970510.235959    (can also be used internally      )
        +--------- indicates a switch from date to time

Format #2:
  970510:2359      (should only be used on print outs)
19970510:2359      (can also be used internally      )
  970510:235959    (should only be used on print outs)
19970510:235959    (can also be used internally      )
  970510:235959.10 (should only be used on print outs)
19970510:235959.10 (can also be used internally      )
        ^      ^
        |      +--- indicates a switch to fractions of a second
        +---------- indicates a switch from date to time

When numeric strings are used in naming data or log files, you will find that sorted directories will be a little more ordered and that file purges are a little safer since you can type:
rm  199705*     to delete all May 97 files in Unix
del 199705*.*   to delete all May 97 files in DOS
del 199705*.*;* to delete all May 97 files in OpenVMS


13 Month Calendar?

It's too bad that many people in the modern world remain superstitious because a 13-month calendar would be more efficient.
 7 days *  4 weeks  =  28 days per month
28 days * 13 months = 364 days per year

Since the length of a year is 365.24 days, the 13th month would have 29 days except on leap year when it should have 30.

With a standard 28 days per month it would be easier for businesses and governments to do monthly economic forecasts. Since western workers usually skip between 2-4 work days near the end of December (Christmas, Boxing Day, etc.), this month would be the best candidate to extend by one or two days.

The 13 month calendar would be better for anyone paid once or twice monthly.

DST07 (Daylight Savings Time 2007)

Back in 2005, the Bush/Cheney Administration (USA) thought they could save some energy starting in 2007 by shifting the beginning of DST from the first Sunday in April to the second Sunday in March (advanced by 3 weeks). They also decided to end DST one week later by moving DST from the last Sunday of October to the first Sunday of November (delayed by one week).

Now you would have thought that the computer industry would have learned their lessons after Y2K, but they didn't. To make matters worse, rather than keep DST rules in the host OS, we now also need to patch:

To add insult to injury, since those Y2K days many North American computer professionals have been let go and their jobs have been outsourced to India where people don't observe DST because they live so close to the equator. Oh well, just another mess linked to the effects of extreme market capitalism.

DST07 and UNIX

To the best of my knowledge, no RTC (real time clock) chips save the time zone. This means that just after a computer's local time has changed, a BIOS call must be made to save the new time to the RTC chip. Failure to do this means that a rebooted computer may come up with the wrong time. For the past 20 years most UNIX systems updated the RTC from root's crontab by calling /usr/sbin/rtc every morning in APRIL and OCTOBER like so.

% crontab -l
# This is root's crontab
# The rtc command is run to adjust the real time clock if and when daylight savings time changes.
10 3 *  * 0,4 /etc/cron.d/logchecker
10 3 *  * 0   /usr/lib/newsyslog
15 3 *  * 0   /usr/lib/fs/nfs/nfsfind
# run task every day in April at 3:01 AM
1  3 *  4 *   [ -x /usr/sbin/rtc ] && /usr/sbin/rtc -c > /dev/null 2>&1
# run task every day in October at 2:01 AM
1  2 * 10 *   [ -x /usr/sbin/rtc ] && /usr/sbin/rtc -c > /dev/null 2>&1

To fix your system you'll need to implement one of the following two suggestions. If you don't know how to make these changes then you'll need to contact your local UNIX guru.

# The two red lines above could be replaced with the following (suggestion #1 - preferred)
# run task every day at 3:01 AM
1  3 * * *    [ -x /usr/sbin/rtc ] && /usr/sbin/rtc -c > /dev/null 2>&1

# The two yellow lines above could be replaced with the following (suggestion #2 - alternate)
# run task every day in March + April at 3:01
1  3 *  3,4  * [ -x /usr/sbin/rtc ] && /usr/sbin/rtc -c > /dev/null 2>&1
# run task every day in October + November at 2:01
1  2 * 10,11 * [ -x /usr/sbin/rtc ] && /usr/sbin/rtc -c > /dev/null 2>&1

You should to stick with database support

A good way to avoid future date-time problems is to stick with products with built-in support. For example, there a datetime object built into most databases. Look at these two examples from MySQL + MariaDB. The second example is a hack to magically return the data in ISO-8601 format

MariaDB [(none)]> select now();
| now()               |
| 2018-10-22 14:13:23 |
1 row in set (0.00 sec)

MariaDB [(none)]> select now()+0;
| now()+0        |
| 20181022141330 |
1 row in set (0.00 sec)

MariaDB [(none)]>


Calendars Date + Time Formatting
Back to Home
Neil Rieck
Waterloo, Ontario, Canada.