| #include <u.h> |
| #include <libc.h> |
| |
| #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; i<tm->mon; 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; |
| } |