On Wed, Nov 6, 2024 at 2:11 PM Gregory Nutt <spudan...@gmail.com> wrote: > Here are solutions and details of implementations as implemented by > other OSs and file systems (the year 2038 problem does apply to > timestamps and meta-data in file systems too! Including NFS). See > https://en.wikipedia.org/wiki/Year_2038_problem > > Implemented solutions > > * Starting with Ruby > <https://en.wikipedia.org/wiki/Ruby_(programming_language)> version > 1.9.2 (released on 18 August 2010), the bug with year 2038 is > fixed,^[16] > <https://en.wikipedia.org/wiki/Year_2038_problem#cite_note-18> by > storing time in a signed 64-bit integer on systems with 32-bit > |time_t|.^[17] > <https://en.wikipedia.org/wiki/Year_2038_problem#cite_note-19> > * Starting with NetBSD <https://en.wikipedia.org/wiki/NetBSD> version > 6.0 (released in October 2012), the NetBSD operating system uses a > 64-bit |time_t| for both 32-bit and 64-bit architectures. > Applications that were compiled for an older NetBSD release with > 32-bit |time_t| are supported via a binary compatibility layer, but > such older applications will still suffer from the Y2038 > problem.^[18] > <https://en.wikipedia.org/wiki/Year_2038_problem#cite_note-20> > * OpenBSD <https://en.wikipedia.org/wiki/OpenBSD> since version 5.5, > released in May 2014, also uses a 64-bit |time_t| for both 32-bit > and 64-bit architectures. In contrast to NetBSD > <https://en.wikipedia.org/wiki/NetBSD>, there is no binary > compatibility layer. Therefore, applications expecting a 32-bit > |time_t| and applications using anything different from |time_t| to > store time values may break.^[19] > <https://en.wikipedia.org/wiki/Year_2038_problem#cite_note-21> > * Linux <https://en.wikipedia.org/wiki/Linux> originally used a 64-bit > |time_t| for 64-bit architectures only; the pure 32-bit ABI > <https://en.wikipedia.org/wiki/Application_binary_interface> was not > changed due to backward compatibility.^[20] > > <https://en.wikipedia.org/wiki/Year_2038_problem#cite_note-Pondering2038-22> > Starting with version 5.6 > > <https://en.wikipedia.org/wiki/Linux_kernel_version_history#Releases_5.x.y> > of 2020, 64-bit |time_t| is supported on 32-bit architectures, too. > This was done primarily for the sake of embedded Linux > <https://en.wikipedia.org/wiki/Linux_on_embedded_systems> > systems.^[21] > <https://en.wikipedia.org/wiki/Year_2038_problem#cite_note-23> > * GNU C Library <https://en.wikipedia.org/wiki/GNU_C_Library> since > version 2.34 (released August 2021), added support for using 64-bit > |time_t| on 32-bit platforms with appropriate Linux versions. This > support can be activated by defining preprocessor macro |_TIME_BITS| > to |64| when compiling source code.^[22] > <https://en.wikipedia.org/wiki/Year_2038_problem#cite_note-24> > * FreeBSD <https://en.wikipedia.org/wiki/FreeBSD> uses 64-bit |time_t| > for all 32-bit and 64-bit architectures except 32-bit i386, which > uses signed 32-bit |time_t| instead.^[23] > <https://en.wikipedia.org/wiki/Year_2038_problem#cite_note-25> > * The x32 ABI <https://en.wikipedia.org/wiki/X32_ABI> for Linux (which > defines an environment for programs with 32-bit addresses but > running the processor in 64-bit mode) uses a 64-bit |time_t|. Since > it was a new environment, there was no need for special > compatibility precautions.^[20] > > <https://en.wikipedia.org/wiki/Year_2038_problem#cite_note-Pondering2038-22> > > * Network File System > <https://en.wikipedia.org/wiki/Network_File_System> version 4 has > defined its time fields as |struct nfstime4 {int64_t seconds; > uint32_t nseconds;}| since December 2000.^[24] > <https://en.wikipedia.org/wiki/Year_2038_problem#cite_note-26> > Version 3 supports unsigned 32-bit values as |struct nfstime3 > {uint32 seconds; uint32 nseconds;};|.^[25] > <https://en.wikipedia.org/wiki/Year_2038_problem#cite_note-27> > Values greater than zero for the seconds field denote dates after > the 0-hour, January 1, 1970. Values less than zero for the seconds > field denote dates before the 0-hour, January 1, 1970. In both > cases, the nseconds (nanoseconds) field is to be added to the > seconds field for the final time representation. > * The ext4 <https://en.wikipedia.org/wiki/Ext4> filesystem, when used > with inode sizes larger than 128 bytes, has an extra 32-bit field > per timestamp, of which 30 bits are used for the nanoseconds part of > the timestamp, and the other 2 bits are used to extend the timestamp > range to the year 2446.^[26] > <https://en.wikipedia.org/wiki/Year_2038_problem#cite_note-28> > * The XFS <https://en.wikipedia.org/wiki/XFS> filesystem, starting > with Linux 5.10, has an optional "big timestamps" feature which > extends the timestamp range to the year 2486.^[27] > <https://en.wikipedia.org/wiki/Year_2038_problem#cite_note-29> > * While the native APIs of OpenVMS > <https://en.wikipedia.org/wiki/OpenVMS> can support timestamps up to > 31 July 31086,^[28] > > <https://en.wikipedia.org/wiki/Year_2038_problem#cite_note-Crazy_time,_Stanford,_1997-30> > the C runtime library (CRTL) uses 32-bit integers for |time_t|.^[29] > <https://en.wikipedia.org/wiki/Year_2038_problem#cite_note-vsi-c-rtl-31> > As part of Y2K compliance work that was carried out in 1998, the > CRTL was modified to use unsigned 32-bit integers to represent time; > extending the range of |time_t| up to 7 February 2106.^[30] > <https://en.wikipedia.org/wiki/Year_2038_problem#cite_note-32> > * PostgreSQL <https://en.wikipedia.org/wiki/PostgreSQL> since version > 7.2, released 2002-02-04, stores timestamp WITHOUT TIMEZONE as > 64-bit.^[31] > <https://en.wikipedia.org/wiki/Year_2038_problem#cite_note-33> > ^[/failed verification > <https://en.wikipedia.org/wiki/Wikipedia:Verifiability>/] Prior > versions already stored timestamp as 64-bit.^[/citation needed > <https://en.wikipedia.org/wiki/Wikipedia:Citation_needed>/] > * As of MySQL <https://en.wikipedia.org/wiki/MySQL> 8.0.28, released > in January 2022, the functions |FROM_UNIXTIME()|, > |UNIX_TIMESTAMP()|, and |CONVERT_TZ()| handle 64-bit values on > platforms that support them. This includes 64-bit versions of Linux, > macOS, and Windows.^[32] > <https://en.wikipedia.org/wiki/Year_2038_problem#cite_note-34> ^[33] > <https://en.wikipedia.org/wiki/Year_2038_problem#cite_note-35> In > older versions, built-in functions like |UNIX_TIMESTAMP()| will > return 0 after 03:14:07 UTC <https://en.wikipedia.org/wiki/UTC> on > 19 January 2038.^[34] > <https://en.wikipedia.org/wiki/Year_2038_problem#cite_note-36> > * As of MariaDB <https://en.wikipedia.org/wiki/MariaDB> 11.5.1, > released in May 2024, the data type |TIMESTAMP| and functions > |FROM_UNIXTIME()|, |UNIX_TIMESTAMP()|, and |CONVERT_TZ()| handle > unsigned 32-bit values on 64-bit versions of Linux, macOS, and > Windows.^[35] > <https://en.wikipedia.org/wiki/Year_2038_problem#cite_note-37> This > extended the range to 2106-02-07 06:28:15 and allowed users to store > such timestamp values in tables without changing the storage layout > and thus staying fully compatible with existing user data. > * Starting with Visual C++ > <https://en.wikipedia.org/wiki/Visual_C%2B%2B> 2005, the CRT uses a > 64-bit |time_t| unless the |_USE_32BIT_TIME_T| preprocessor macro is > defined.^[36] > <https://en.wikipedia.org/wiki/Year_2038_problem#cite_note-38> > However, the Windows API <https://en.wikipedia.org/wiki/Windows_API> > itself is unaffected by the year 2038 bug, as Windows > <https://en.wikipedia.org/wiki/Microsoft_Windows> internally tracks > time as the number of 100-nanosecond intervals since 1 January 1601 > in a 64-bit signed integer, which will not overflow until year > 30,828 > > <https://en.wikipedia.org/wiki/Time_formatting_and_storage_bugs#Year_30,828>.^[37] > <https://en.wikipedia.org/wiki/Year_2038_problem#cite_note-39>
Thank you Greg!! That proves int64_t is widely adopted and kinda standard now :-) Having this as kconfig selectable configuration option that can be manually switched to int32_t or uint32_t provides choice to delopers and no surprises :-) -- CeDeROM, SQ7MHZ, http://www.tomek.cedro.info