Skip to content
This repository

Fix time.h on 32 bit machines to work past the year 2038 bug

Fetching latest commit…

Octocat-spinner-32-eaf2f5

Cannot retrieve the latest commit at this time

Octocat-spinner-32 bin
Octocat-spinner-32 patches A patch to Time-Local-Extended 0.48 January 29, 2010
Octocat-spinner-32 perl
Octocat-spinner-32 t
Octocat-spinner-32 INSTALL
Octocat-spinner-32 LICENSE
Octocat-spinner-32 Makefile
Octocat-spinner-32 README.txt
Octocat-spinner-32 time64.c
Octocat-spinner-32 time64.h
Octocat-spinner-32 time64_config.h
README.txt
This is an implementation of POSIX time.h which solves the year 2038
bug on systems where time_t is only 32 bits.  It is implemented in
bog-standard ANSI C.  The latest version can be found at
http://y2038.googlecode.com/

It makes use of the system's native 32 bit functions to perform time
zone and daylight savings time calculations and thus does *not* need
to ship its own time zone table.

time64.h currently implements three public functions, localtime64_r(),
gmtime64_r() and timegm64().  They are implementations of
localtime_r(), gmtime_r() and timegm64().

To install, simply copy time64.c and time64.h into your project and
make use of the functions.

To test, run "make test".  You must have Perl, prove (which comes with
a recent version of the Test::Harness Perl module) and bzdiff
installed to run the full test suite.  It will do a number of unit
tests, plus test against a large table of known good values in
different time zones.


Limitations, Issues, etc...
---------------------------

localtime64_r() gets its time zone and daylight savings time information by
mappping the future year back to a similar one between 2010 and 2037, safe
for localtime_r().  The calculations are accurate according to current time
zone and daylight savings information, but may become inaccurate if a
change is made that takes place after 2010.

Future versions will probe for a 64 bit safe system localtime_r() and
gmtime_r() and use that.

The maximum date is still limited by your tm struct.  Most 32 bit
systems use a signed integer tm_year which means the practical upper
limit is the year 2147483647 which is somewhere around 2**54.  You can
use a 64 bit clean tm struct by setting USE_TM64 in time64.h


Portability
-----------

I would like to add some configuration detection stuff in the future, but
for now all I can do is document the assumptions...

This code assumes that long longs are 64 bit integers which is technically
in violation of the C standard.  This can be changed in time64.h by
changing the Time64_T and Int64 typedefs.

There are a number of configuration options in time64.h.
Something went wrong with that request. Please try again.