Blame


1 f35a0486 2008-07-09 devnull #include <u.h>
2 f35a0486 2008-07-09 devnull #include <libc.h>
3 f35a0486 2008-07-09 devnull
4 f35a0486 2008-07-09 devnull #include "zoneinfo.h"
5 f35a0486 2008-07-09 devnull
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)
9 f35a0486 2008-07-09 devnull
10 f35a0486 2008-07-09 devnull /*
11 f35a0486 2008-07-09 devnull * days per month plus days/year
12 f35a0486 2008-07-09 devnull */
13 f35a0486 2008-07-09 devnull static int dmsize[] =
14 f35a0486 2008-07-09 devnull {
15 f35a0486 2008-07-09 devnull 365, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
16 f35a0486 2008-07-09 devnull };
17 f35a0486 2008-07-09 devnull static int ldmsize[] =
18 f35a0486 2008-07-09 devnull {
19 f35a0486 2008-07-09 devnull 366, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
20 f35a0486 2008-07-09 devnull };
21 f35a0486 2008-07-09 devnull
22 f35a0486 2008-07-09 devnull /*
23 f35a0486 2008-07-09 devnull * return the days/month for the given year
24 f35a0486 2008-07-09 devnull */
25 f35a0486 2008-07-09 devnull static int *
26 f35a0486 2008-07-09 devnull yrsize(int y)
27 f35a0486 2008-07-09 devnull {
28 f35a0486 2008-07-09 devnull if((y%4) == 0 && ((y%100) != 0 || (y%400) == 0))
29 f35a0486 2008-07-09 devnull return ldmsize;
30 f35a0486 2008-07-09 devnull else
31 f35a0486 2008-07-09 devnull return dmsize;
32 f35a0486 2008-07-09 devnull }
33 f35a0486 2008-07-09 devnull
34 f35a0486 2008-07-09 devnull /*
35 f35a0486 2008-07-09 devnull * compute seconds since Jan 1 1970 GMT
36 f35a0486 2008-07-09 devnull * and convert to our timezone.
37 f35a0486 2008-07-09 devnull */
38 f35a0486 2008-07-09 devnull long
39 f35a0486 2008-07-09 devnull tm2sec(Tm *tm)
40 f35a0486 2008-07-09 devnull {
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;
44 f35a0486 2008-07-09 devnull
45 f35a0486 2008-07-09 devnull secs = 0;
46 f35a0486 2008-07-09 devnull
47 f35a0486 2008-07-09 devnull /*
48 f35a0486 2008-07-09 devnull * seconds per year
49 f35a0486 2008-07-09 devnull */
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;
54 f35a0486 2008-07-09 devnull }
55 f35a0486 2008-07-09 devnull
56 f35a0486 2008-07-09 devnull /*
57 f35a0486 2008-07-09 devnull * if mday is set, use mon and mday to compute yday
58 f35a0486 2008-07-09 devnull */
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;
65 f35a0486 2008-07-09 devnull }else{
66 f35a0486 2008-07-09 devnull yday = tm->yday;
67 f35a0486 2008-07-09 devnull }
68 f35a0486 2008-07-09 devnull secs += yday * SEC2DAY;
69 f35a0486 2008-07-09 devnull
70 f35a0486 2008-07-09 devnull /*
71 f35a0486 2008-07-09 devnull * hours, minutes, seconds
72 f35a0486 2008-07-09 devnull */
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;
76 f35a0486 2008-07-09 devnull
77 f35a0486 2008-07-09 devnull /*
78 f35a0486 2008-07-09 devnull * Assume the local time zone if zone is not GMT
79 f35a0486 2008-07-09 devnull */
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) {
85 f35a0486 2008-07-09 devnull /*
86 f35a0486 2008-07-09 devnull * to what local time period `secs' belongs?
87 f35a0486 2008-07-09 devnull */
88 f35a0486 2008-07-09 devnull if (ti->tzoff>0) {
89 f35a0486 2008-07-09 devnull /*
90 f35a0486 2008-07-09 devnull * east of GMT; check previous local time transition
91 f35a0486 2008-07-09 devnull */
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;
95 f35a0486 2008-07-09 devnull } else
96 f35a0486 2008-07-09 devnull /*
97 f35a0486 2008-07-09 devnull * west of GMT; check next local time transition
98 f35a0486 2008-07-09 devnull */
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;
104 f35a0486 2008-07-09 devnull }
105 f35a0486 2008-07-09 devnull }
106 fa325e9b 2020-01-10 cross
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;
110 f35a0486 2008-07-09 devnull }