The year 2038 problem (also known as Unix Millennium Bug, Y2K38 by analogy to the Y2K problem) may cause some computer software to fail before or in the year 2038. The problem affects all software and systems that store system time as a signed 32-bit integer, and interpret this number as the number of seconds since 00:00:00 UTC on Thursday, 01 January 1970.[1]
The latest time that can be represented this way is 03:14:07 UTC on Tuesday, 19 January 2038. Times beyond this moment will "wrap around" and be stored internally as a negative number, which these systems will interpret as a date in 1901 rather than 2038. This will likely cause problems for users of these systems due to erroneous calculations.
Further, while most programs will only be affected in or very close to 2038, programs that work with future dates will begin to run into problems much sooner. For example, a program that works with dates 20 years in the future will have to be fixed no later than in 2018.
Because most 32-bit Unix-like systems store and manipulate time in this format, it is usually called Unix time, and so the year 2038 problem is often referred to as the Unix Millennium Bug. However, any other non-Unix operating systems and software that store and manipulate time this way will be just as vulnerable.
Early problems
In May 2006, reports surfaced of an early Y2038 problem in the AOLserver software. The software was designed with a kludge to handle a database request that should "never" time out: rather than specifically handle this special case, the initial design simply specified an arbitrary timeout date in the future. The default configuration for the server specified a timeout of one billion seconds. One billion seconds (approximately 32 years) after 21:27:28 on 12 May 2006 is beyond the 2038 cutoff date, so after this date, the timeout calculation overflowed and calculated a timeout date that was actually in the past, causing the software to crash. When the problem was discovered, server managers had to edit the configuration file and set the timeout to a lower value.[2][3]
Solutions
There is no easy fix for this problem for existing CPU/OS combinations, existing file systems, or existing binary data formats. Changing the definition of time_t data type to a 64-bit type would break binary compatibility for software, data storage, and generally anything dealing with the binary representation of time. Changing time_t to an unsigned 32-bit integer, effectively allowing timestamps to be accurate until the year 2106, would affect many programs that deal with time differences or dates before 1970, and thus also break binary compatibility in many cases.
Most operating systems for 64-bit architectures already use 64-bit integers in their time_t, and these operating systems are becoming more common, particularly in desktop and server environments. Using a (signed) 64-bit value introduces a new wraparound date in approximately 292 billion years, on Sunday, December 4, 292,277,026,596 AD. As of 2007, however, hundreds of millions of 32-bit systems are deployed, many in embedded systems, and it is far from certain if they will all be replaced by 2038. Also 32-bit applications running on a 64-bit system are likely to be affected by the issue.
Despite the modern 18-to-24-month generational update in computer systems technology, embedded computers may operate unchanged for the life of the system they control. The use of 32-bit time_t has also been encoded into some file formats, which means it can live on for a long time beyond the life of the machines the file format was initially designed for.
Alternative proposals have been made, some of which are in use, including storing either milliseconds or microseconds since an epoch (typically either 1 January 1970 or 1 January 2000) in a signed-64 bit integer, providing a minimum of 300,000 years range.[4][5] Other proposals for new time representations provide different precisions, ranges, and sizes (almost always wider than 32 bits), as well as solving other related problems, such as the handling of leap seconds.
No comments:
Post a Comment