#include #include #include "zoneinfo.h" #define SEC2MIN 60L #define SEC2HOUR (60L*SEC2MIN) #define SEC2DAY (24L*SEC2HOUR) /* * days per month plus days/year */ static int dmsize[] = { 365, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; static int ldmsize[] = { 366, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; /* * return the days/month for the given year */ static int * yrsize(int y) { if((y%4) == 0 && ((y%100) != 0 || (y%400) == 0)) return ldmsize; else return dmsize; } /* * compute seconds since Jan 1 1970 GMT * and convert to our timezone. */ long tm2sec(Tm *tm) { Tinfo ti0, ti1, *ti; long secs; int i, yday, year, *d2m; secs = 0; /* * seconds per year */ year = tm->year + 1900; for(i = 1970; i < year; i++){ d2m = yrsize(i); secs += d2m[0] * SEC2DAY; } /* * if mday is set, use mon and mday to compute yday */ if(tm->mday){ yday = 0; d2m = yrsize(year); for(i=0; imon; i++) yday += d2m[i+1]; yday += tm->mday-1; }else{ yday = tm->yday; } secs += yday * SEC2DAY; /* * hours, minutes, seconds */ secs += tm->hour * SEC2HOUR; secs += tm->min * SEC2MIN; secs += tm->sec; /* * Assume the local time zone if zone is not GMT */ if(strcmp(tm->zone, "GMT") != 0) { i = zonelookuptinfo(&ti0, secs); ti = &ti0; if (i != -1) if (ti->tzoff!=0) { /* * to what local time period `secs' belongs? */ if (ti->tzoff>0) { /* * east of GMT; check previous local time transition */ if (ti->t+ti->tzoff > secs) if (zonetinfo(&ti1, i-1)!=-1) ti = &ti1; } else /* * west of GMT; check next local time transition */ if (zonetinfo(&ti1, i+1)) if (ti1.t+ti->tzoff < secs) ti = &ti1; // fprint(2, "tt: %ld+%d %ld\n", (long)ti->t, ti->tzoff, (long)secs); secs -= ti->tzoff; } } if(secs < 0) secs = 0; return secs; }