Most 32-bit Unix-like systems store and manipulate time in this format, so this problem is often referred to as the "Unix Millennium Bug". However, there are many other non-Unix operating systems and software that store and manipulate time this way, and these will be just as affected by this problem.
$ date Su 6. Jul 00:32:27 CEST 2008 $ openssl req -x509 -in server.csr -key server.key -out server.crt -days 10789 && openssl x509 -in server.crt -text | grep AfterNot After : Jan 18 22:32:32 2038 GMT$ openssl req -x509 -in server.csr -key server.key -out server.crt -days 10790 && openssl x509 -in server.crt -text | grep AfterNot After : Dec 14 16:04:21 1901 GMT (32-Bit System)$ openssl req -x509 -in server.csr -key server.key -out server.crt -days 2918831 && openssl x509 -in server.crt -text | grep AfterNot After : Dec 31 22:41:18 9999 GMT (64-Bit System)
time_tto use a 64-bit type would break binary compatibility for software, data storage, and generally anything dealing with the binary representation of time. Changing
time_tto an unsigned 32-bit integer, effectively allowing timestamps to be accurate until the year 2106, would affect many programs that deal with time differences, 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. The move to these architectures is already under way and many expect it to be complete before 2038. Using a (signed) 64-bit value introduces a new wraparound date in about 290 billion years, on Sunday, December 4, 292,277,026,596. As of 2007, however, hundreds of millions of 32-bit systems are deployed, many in embedded systems, and it is far from certain they will all be replaced by 2038. Further, long before that date programs which project any kind of pattern into the future will begin to run into problems. E.g.; by 2028, projecting a trend ten years will encounter the "bug".
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 involved.
A variety of alternative proposals have been made, some of which are in use, including storing either milliseconds or microseconds since an epoch (typically either January 1, 1970 or January 1, 2000) in a signed-64 bit integer, providing a minimum of 300,000 years range. 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.