Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 24 Aug 2004 00:15:38 +0000 (UTC)
From:      Peter Wemm <peter@FreeBSD.org>
To:        src-committers@FreeBSD.org, cvs-src@FreeBSD.org, cvs-all@FreeBSD.org
Subject:   cvs commit: src/lib/libc/stdtime localtime.c
Message-ID:  <200408240015.i7O0Fc94099246@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
peter       2004-08-24 00:15:37 UTC

  FreeBSD src repository

  Modified files:
    lib/libc/stdtime     localtime.c 
  Log:
  struct tm.tm_year is listed as 'years since 1900', and is signed.  On
  64 bit systems, years roughly -2^31 through 2^31 can be represented in
  time_t without any trouble.  32 bit time_t systems only range from
  roughly 1902 through 2038.  As a consequence, none of the date munging
  code for all the various calendar tweaks before then is present.  There
  are other problems including the fact that there was no 'year zero' and
  so on.  So rather than get excited about trying to figure out when the
  calendar jumped by two weeks etc, simply disallow negative (ie: prior to
  1900) years.
  
  This happens to have an important side effect.  If you bzero a 'struct
  tm', it corresponds to 'Jan 0, 1900, 00:00 GMT'.  This happens to be
  representable (after canonification) in 64 bit time_t space.  Zero tm
  structs are generally an error and mktime normally returns -1 for them.
  Interestingly, it tries to canonify the 'jan 0' to 'dec 31, 1899', ie:
  year -1.  This conveniently trips the negative year test above, which
  means we can trivially detect the null 'tm' struct.
  
  This actually tripped up code at work. :-/  (Don't ask)
  
  Revision  Changes    Path
  1.40      +3 -0      src/lib/libc/stdtime/localtime.c



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200408240015.i7O0Fc94099246>