1 f35a0486 2008-07-09 devnull #include <u.h>
2 f35a0486 2008-07-09 devnull #include <libc.h>
4 f35a0486 2008-07-09 devnull #include "zoneinfo.h"
6 f35a0486 2008-07-09 devnull #define SEC2MIN 60L
7 f35a0486 2008-07-09 devnull #define SEC2HOUR (60L*SEC2MIN)
8 f35a0486 2008-07-09 devnull #define SEC2DAY (24L*SEC2HOUR)
11 f35a0486 2008-07-09 devnull * days per month plus days/year
13 f35a0486 2008-07-09 devnull static int dmsize[] =
15 f35a0486 2008-07-09 devnull 365, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
17 f35a0486 2008-07-09 devnull static int ldmsize[] =
19 f35a0486 2008-07-09 devnull 366, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
23 f35a0486 2008-07-09 devnull * return the days/month for the given year
25 f35a0486 2008-07-09 devnull static int *
26 f35a0486 2008-07-09 devnull yrsize(int y)
28 f35a0486 2008-07-09 devnull if((y%4) == 0 && ((y%100) != 0 || (y%400) == 0))
29 f35a0486 2008-07-09 devnull return ldmsize;
31 f35a0486 2008-07-09 devnull return dmsize;
35 f35a0486 2008-07-09 devnull * compute seconds since Jan 1 1970 GMT
36 f35a0486 2008-07-09 devnull * and convert to our timezone.
39 f35a0486 2008-07-09 devnull tm2sec(Tm *tm)
41 f35a0486 2008-07-09 devnull Tinfo ti0, ti1, *ti;
42 f35a0486 2008-07-09 devnull long secs;
43 f35a0486 2008-07-09 devnull int i, yday, year, *d2m;
45 f35a0486 2008-07-09 devnull secs = 0;
48 f35a0486 2008-07-09 devnull * seconds per year
50 f35a0486 2008-07-09 devnull year = tm->year + 1900;
51 f35a0486 2008-07-09 devnull for(i = 1970; i < year; i++){
52 f35a0486 2008-07-09 devnull d2m = yrsize(i);
53 f35a0486 2008-07-09 devnull secs += d2m[0] * SEC2DAY;
57 f35a0486 2008-07-09 devnull * if mday is set, use mon and mday to compute yday
59 f35a0486 2008-07-09 devnull if(tm->mday){
60 f35a0486 2008-07-09 devnull yday = 0;
61 f35a0486 2008-07-09 devnull d2m = yrsize(year);
62 f35a0486 2008-07-09 devnull for(i=0; i<tm->mon; i++)
63 f35a0486 2008-07-09 devnull yday += d2m[i+1];
64 f35a0486 2008-07-09 devnull yday += tm->mday-1;
66 f35a0486 2008-07-09 devnull yday = tm->yday;
68 f35a0486 2008-07-09 devnull secs += yday * SEC2DAY;
71 f35a0486 2008-07-09 devnull * hours, minutes, seconds
73 f35a0486 2008-07-09 devnull secs += tm->hour * SEC2HOUR;
74 f35a0486 2008-07-09 devnull secs += tm->min * SEC2MIN;
75 f35a0486 2008-07-09 devnull secs += tm->sec;
78 f35a0486 2008-07-09 devnull * Assume the local time zone if zone is not GMT
80 f35a0486 2008-07-09 devnull if(strcmp(tm->zone, "GMT") != 0) {
81 f35a0486 2008-07-09 devnull i = zonelookuptinfo(&ti0, secs);
82 f35a0486 2008-07-09 devnull ti = &ti0;
83 f35a0486 2008-07-09 devnull if (i != -1)
84 f35a0486 2008-07-09 devnull if (ti->tzoff!=0) {
86 f35a0486 2008-07-09 devnull * to what local time period `secs' belongs?
88 f35a0486 2008-07-09 devnull if (ti->tzoff>0) {
90 f35a0486 2008-07-09 devnull * east of GMT; check previous local time transition
92 f35a0486 2008-07-09 devnull if (ti->t+ti->tzoff > secs)
93 f35a0486 2008-07-09 devnull if (zonetinfo(&ti1, i-1)!=-1)
94 f35a0486 2008-07-09 devnull ti = &ti1;
97 f35a0486 2008-07-09 devnull * west of GMT; check next local time transition
99 f35a0486 2008-07-09 devnull if (zonetinfo(&ti1, i+1))
100 f35a0486 2008-07-09 devnull if (ti1.t+ti->tzoff < secs)
101 f35a0486 2008-07-09 devnull ti = &ti1;
102 f35a0486 2008-07-09 devnull // fprint(2, "tt: %ld+%d %ld\n", (long)ti->t, ti->tzoff, (long)secs);
103 f35a0486 2008-07-09 devnull secs -= ti->tzoff;
107 f35a0486 2008-07-09 devnull if(secs < 0)
108 f35a0486 2008-07-09 devnull secs = 0;
109 f35a0486 2008-07-09 devnull return secs;