|
|
1.1 root 1: #ifndef lint
2: static char *sccsid = "@(#)time.c 1.7 (Berkeley) 6/26/87";
3: #endif
4:
5: /*
6: * Collection of routines for dealing with ASCII time strings.
7: * These may actually be useful in their own right.
8: */
9:
10: #include <stdio.h>
11: #include <sys/types.h>
12: #include <sys/time.h>
13: #include <ctype.h>
14: #include <strings.h>
15:
16: /*
17: * dtol -- convert date to long integer. This is not implicitly
18: * local time, or any other kind of time, for that matter. If you
19: * pass it a date you think is GMT, you wind up with that number of
20: * seconds...
21: *
22: * Parameters: "date_ascii" is in the form "yymmddhhmmss".
23: *
24: * Returns: Long integer containing number
25: * of seconds since 000000 Jan 1, 1970,
26: * and "date". -1 on error.
27: *
28: * Side effects: None.
29: */
30:
31: #define twodigtoi(x) (((x[0]) - '0') + (x[1] - '0')*10)
32: #define dysize(y) ((y % 4 ? 365 : 366))
33:
34: static int dmsize[12] =
35: { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
36:
37: long
38: dtol(date_ascii)
39: char *date_ascii;
40: {
41: char date[32], *date_str;
42: char *lhs, *rhs;
43: char temp;
44: long seconds;
45: int year, month, day, hour, mins, secs;
46: int len, i;
47:
48: len = strlen(date_ascii);
49: if (len != sizeof("yymmddhhmmss")-1)
50: return (-1);
51:
52: (void) strcpy(date, date_ascii);
53: date_str = date;
54:
55: #ifdef debug
56: printf("date_str = %s\n", date_str);
57: #endif
58: rhs = date_str + len - 1;
59: lhs = date_str;
60:
61: for (; lhs < rhs; ++lhs, --rhs) {
62: temp = *lhs;
63: *lhs = *rhs;
64: *rhs = temp;
65: if (!isdigit(temp) || !isdigit(*lhs))
66: return (-1);
67: }
68:
69: lhs = date_str;
70: #ifdef debug
71: printf("date_str = %s\n", date_str);
72: #endif
73:
74: secs = twodigtoi(lhs);
75: lhs += 2;
76: mins = twodigtoi(lhs);
77: lhs += 2;
78: hour = twodigtoi(lhs);
79: lhs += 2;
80: day = twodigtoi(lhs);
81: lhs += 2;
82: month = twodigtoi(lhs);
83: lhs += 2;
84: year = twodigtoi(lhs);
85:
86: if (month < 1 || month > 12 ||
87: day < 1 || day > 31 ||
88: mins < 0 || mins > 59 ||
89: secs < 0 || secs > 59)
90: return (-1);
91: if (hour == 24) {
92: hour = 0;
93: day++;
94: }
95: if (hour < 0 || hour > 23)
96: return (-1);
97: seconds = 0;
98: year += 1900;
99: for (i = 1970; i < year; i++)
100: seconds += dysize(i);
101: /* Leap year */
102: if (dysize(year) == 366 && month >= 3)
103: seconds++;
104: while (--month)
105: seconds += dmsize[month-1];
106: seconds += day-1;
107: seconds = 24 * seconds + hour;
108: seconds = 60 * seconds + mins;
109: seconds = 60 * seconds + secs;
110:
111: return (seconds);
112: }
113:
114:
115: /*
116: * ltod -- convert long integer to date string.
117: *
118: * Parameters: "date" is in the number of seconds
119: * since the epoch.
120: *
121: * Returns: Pointer to static data in the form
122: * yymmddhhmmss\0.
123: *
124: * Side effects: None.
125: */
126:
127: char *
128: ltod(date)
129: long date;
130: {
131: static char timebuf[32];
132: struct tm *tp;
133:
134: tp = gmtime(&date);
135:
136: (void) sprintf(timebuf, "%02d%02d%02d%02d%02d%02d",
137: tp->tm_year,
138: tp->tm_mon + 1, /* 0 to 11??? How silly. */
139: tp->tm_mday,
140: tp->tm_hour,
141: tp->tm_min,
142: tp->tm_sec);
143:
144: return (timebuf);
145: }
146:
147:
148: /*
149: * local_to_gmt -- convert a local time (in form of number of
150: * seconds since you-know-when) to GMT.
151: *
152: * Parameters: "date" is date we want converted, in
153: * seconds since 000000 1 Jan 1970.
154: *
155: * Returns: Number of seconds corrected for local
156: * and dst.
157: */
158:
159: long
160: local_to_gmt(date)
161: long date;
162: {
163: struct timeval tv;
164: struct timezone tz;
165:
166: (void) gettimeofday(&tv, &tz);
167: date += (long) tz.tz_minuteswest * 60;
168:
169: /* now fix up local daylight time */
170: if (localtime((time_t *)&date)->tm_isdst)
171: date -= 60*60;
172:
173: return (date);
174: }
175:
176: /*
177: * gmt_to_local -- take a GMT time expressed in seconds since
178: * the epoch, and convert it to local time.
179: *
180: * Parameters: "date" is the number of seconds...
181: *
182: * Returns: Number of seconds corrected to reflect
183: * local time and dst.
184: */
185:
186: long
187: gmt_to_local(date)
188: long date;
189: {
190: struct timeval tv;
191: struct timezone tz;
192:
193: (void) gettimeofday(&tv, &tz);
194: date -= (long) tz.tz_minuteswest * 60;
195:
196: /* now fix up local daylight time */
197: if (localtime((time_t *)&date)->tm_isdst)
198: date += 60*60;
199:
200: return (date);
201: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.