You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apr.apache.org by br...@apache.org on 2001/07/01 23:47:54 UTC

cvs commit: apr/time/unix time.c

brane       01/07/01 14:47:54

  Modified:    time/unix time.c
  Log:
  Adjust the calculated GMT offset on get_offset() for daylight savings time.
  This only affects platforms that do not have a tm_gmtoff field in struct tm
  (e.g., Solaris 2.6, HP-UX 10.20, ...).
  
  Revision  Changes    Path
  1.49      +12 -2     apr/time/unix/time.c
  
  Index: time.c
  ===================================================================
  RCS file: /home/cvs/apr/time/unix/time.c,v
  retrieving revision 1.48
  retrieving revision 1.49
  diff -u -r1.48 -r1.49
  --- time.c	2001/06/30 09:50:29	1.48
  +++ time.c	2001/07/01 21:47:53	1.49
  @@ -77,18 +77,28 @@
   #elif defined(HAVE___OFFSET)
       return tm->__tm_gmtoff;
   #else
  -    /* we don't have an offset field to use, so calculate it */
  +    /* We don't have an offset field to use, so calculate it.
  +       mktime() is the inverse of localtime(); so, presumably,
  +       passing in a struct tm made by gmtime() let's us calculate
  +       the true GMT offset. However, there's a catch: if daylight
  +       savings is in effect, gmtime()will set the tm_isdst field
  +       and confuse mktime() into returning a time that's offset
  +       by one hour. In that case, we must adjust the calculated GMT
  +       offset. */
       {
           time_t t1 = time(0), t2 = 0;
           struct tm t;
  +        int was_dst;
   
   #if APR_HAS_THREADS && defined(_POSIX_THREAD_SAFE_FUNCTIONS)
           gmtime_r(&t1, &t);
   #else
           t = *gmtime(&t1);
   #endif
  +        was_dst = (t.tm_isdst > 0);
  +        t.tm_isdst = -1;
           t2 = mktime(&t);
  -        return (apr_int32_t) difftime(t1, t2);
  +        return (apr_int32_t) difftime(t1, t2) + (was_dst ? 3600 : 0);
       }
   #endif
   }