The leap year problem is a problem for both digital and non-digital documentation and data storage situations which results from the wrong calculation of which years are leap years, or from manipulating dates without regard to the difference between leap years and common years.
Categories
Leap year bugs typically fall into two impact categories:
Those that lead to error conditions, such as exceptions, error return codes, uninitialized variables, or endless loops
Those that lead to incorrect data, such as off-by-one problems in range queries or aggregation
Examples
Python
The following Python code is an example of a Category 1 leap year bug. It will work properly until today becomes February 29. Then, it will attempt to create a February 29 of a common year, which does not exist. The date constructor will raise a ValueError with the message "day is out of range for month". from datetime import date today = date.today later = today.replace
Windows C++
The following Windows C++ code is an example of a Category 1 leap year bug. It will work properly until st becomes February 29. Then, it will attempt to create a February 29 of a common year, which does not exist. Passing this to any function that accepts a SYSTEMTIME struct will likely fail. For example, the SystemTimeToFileTime call shown here will return an error code. Since that return value is unchecked, this will result in ft being left uninitialized. SYSTEMTIME st; FILETIME ft; GetSystemTime; st.wYear++; SystemTimeToFileTime;
C#
The following.NET C# code is an example of a Category 1 leap year bug. It will work properly until dt becomes February 29. Then, it will attempt to create a February 29 of a common year, which does not exist. The DateTime constructor will throw an ArgumentOutOfRangeException. DateTime dt = DateTime.Now; DateTime result = new DateTime;
JavaScript
The following JavaScript code is an example of a Category 2 leap year bug. It will work properly until dt becomes February 29, such as on 2020-02-29. Then it will attempt to set the year to 2021. Since 2021-02-29 doesn't exist, the Date object will roll forward to the next valid date, which is 2021-03-01. var dt = new Date; dt.setFullYear;
Bad leap year algorithm (many languages)
The following code is an example of a leap year bug that is seen in many languages. It may cause either a Category 1 or Category 2 impact, depending on what the result is used for. It incorrectly assumes that a leap year occurs exactly every four years. bool isLeapYear = year % 4 0;
There have been many occurrences of leap year bugs:
In 2020 a large number of leap year bugs were cataloged in at the website Code of Matt.
In 2016, a leap year bug in the luggage conveyor system at Düsseldorf Airport on February 29 caused over 1,200 pieces of luggage to miss their flights.
In 2016, a large number of leap year bugs were cataloged in at the website Code of Matt.
In 2012, Microsoft Azure was taken offline by the leap year bug on February 28. At 5:45 PM PST the Windows Azure team became aware of an issue, apparently due to a time calculation that was incorrect for the leap year.
In 2012, Gmail's chat history showed a date of December 31, 1969, for all chats saved on February 29.
Sony's PlayStation 3 incorrectly treated 2010 as a leap year, so the non-existent February 29, 2010, was shown on March 1, 2010, and caused a program error.
At midnight on December 31, 2008, many first generation Zune 30 models froze. Microsoft stated that the problem was caused by the internal clock driver written by Freescale and the way the device handles a leap year. It automatically fixed itself 24 hours later, but an intermediate "fix" for those who did not wish to wait was to drain the device's battery and then recharge after noon UTC on January 1, 2009.
In 1996, two aluminum smelting plants at Tiwai Point, New Zealand, and Bell Bay, Tasmania, Australia, experienced a leap year bug on December 31, when each of the 660 computers controlling the smelting potlines shut down at the stroke of midnight simultaneously and without warning. The computers were not programmed to handle the 366th day of the year. Repair costs were estimated at more than.
Microsoft Excel has, since its earliest versions, incorrectly considered 1900 to be a leap year, and therefore that February 29 comes between February 28 and March 1 of that year. The bug originated from Lotus 1-2-3, and was purposely implemented in Excel for the purpose of backward compatibility. Microsoft has written an article about this bug, explaining the reasons for treating 1900 as a leap year. This bug has been promoted into a requirement in the Ecma Office Open XML specification.. Retrieved 2016-09-10.