src/lib/utc-offset.c
author Timo Sirainen <tss@iki.fi>
Tue Jul 21 15:18:49 2009 -0400 (2009-07-21)
branchbranch_1_0
changeset 5571 9073f25d1b94
parent 1741 9df02b1533b3
permissions -rw-r--r--
utc_offset() was broken with year's first/last day if struct tm.tm_gmtoff didn't exist.
     1 /* Copyright (c) 2002-2003 Timo Sirainen */
     2 
     3 #include "lib.h"
     4 #include "utc-offset.h"
     5 
     6 #include <sys/time.h>
     7 
     8 int utc_offset(struct tm *tm, time_t t __attr_unused__)
     9 {
    10 #ifdef HAVE_TM_GMTOFF
    11 	return (int) (tm->tm_gmtoff/60);
    12 #else
    13 	struct tm ltm, gtm;
    14 	int offset;
    15 
    16 	/* gmtime() overwrites tm, so we need to copy it elsewhere */
    17 	ltm = *tm;
    18 	tm = gmtime(&t);
    19 	gtm = *tm;
    20 
    21 	/* max offset of 24 hours */
    22 	if ((ltm.tm_yday < gtm.tm_yday && ltm.tm_year == gtm.tm_year) ||
    23 	    ltm.tm_year < gtm.tm_year)
    24 		offset = -24 * 60;
    25 	else if ((ltm.tm_yday > gtm.tm_yday && ltm.tm_year == gtm.tm_year) ||
    26 		 ltm.tm_year > gtm.tm_year)
    27 		offset = 24 * 60;
    28 	else
    29 		offset = 0;
    30 
    31 	offset += (ltm.tm_hour - gtm.tm_hour) * 60;
    32 	offset += (ltm.tm_min - gtm.tm_min);
    33 
    34 	/* restore overwritten tm */
    35 	*tm = ltm;
    36 	return offset;
    37 #endif
    38 }