OSDN Git Service

- Partial fix for timezone handling.
[tjqt4port/tj2qt4.git] / taskjuggler / Utility.cpp
1 /*
2  * Utility.cpp - TaskJuggler
3  *
4  * Copyright (c) 2001, 2002 by Chris Schlaeger <cs@suse.de>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of version 2 of the GNU General Public License as
8  * published by the Free Software Foundation.
9  *
10  * $Id$
11  */
12
13 #include <stdio.h>
14 #include "Utility.h"
15
16 #include <qdict.h>
17
18 static QDict<const char> TZDict;
19 static bool TZDictReady = FALSE;
20
21 const char*
22 timezone2tz(const char* tzone)
23 {
24         if (!TZDictReady)
25         {
26                 TZDict.insert("PST", "GMP8:00");
27                 TZDict.insert("PDT", "GMT7:00");
28                 TZDict.insert("MST", "GMT7:00");
29                 TZDict.insert("MDT", "GMT6:00");
30                 TZDict.insert("CST", "GMT6:00");
31                 TZDict.insert("CDT", "GMT5:00");
32                 TZDict.insert("EST", "GMT5:00");
33                 TZDict.insert("EDT", "GMT4:00");
34                 TZDict.insert("CET", "GMT-1:00");
35                 TZDict.insert("CEST", "GMT-2:00");
36
37                 TZDictReady = TRUE;
38         }
39
40         return TZDict[tzone];
41 }
42
43 const char*
44 monthAndYear(time_t t)
45 {
46         struct tm* tms = localtime(&t);
47         static char s[32];
48         strftime(s, sizeof(s), "%b %Y", tms);
49         return s;
50 }
51
52 bool
53 isWeekend(time_t t)
54 {
55         struct tm* tms = localtime(&t);
56         return (tms->tm_wday < 1 || tms->tm_wday > 5);
57 }
58
59 int
60 daysLeftInMonth(time_t t)
61 {
62         int left = 0;
63         struct tm* tms = localtime(&t);
64         for (int m = tms->tm_mon; tms->tm_mon == m;
65                  t = sameTimeNextDay(t), localtime(&t))
66         {
67                 left++;
68         }
69         return left;
70 }
71
72 int
73 weeksLeftInMonth(time_t t)
74 {
75         int left = 0;
76         struct tm* tms = localtime(&t);
77         for (int m = tms->tm_mon; tms->tm_mon == m;
78                  t = sameTimeNextWeek(t), localtime(&t))
79         {
80                 left++;
81         }
82         return left;
83 }
84
85 int
86 monthLeftInYear(time_t t)
87 {
88         int left = 0;
89         struct tm* tms = localtime(&t);
90         for (int m = tms->tm_year; tms->tm_year == m;
91                  t = sameTimeNextMonth(t), localtime(&t))
92         {
93                 left++;
94         }
95         return left;
96 }
97
98 int
99 daysBetween(time_t t1, time_t t2)
100 {
101         int days = 0;
102         // TODO: Very slow!!!
103         for (time_t t = t1; t < t2; t = sameTimeNextDay(t))
104                 days++;
105         return days;
106 }
107
108 int
109 weeksBetween(time_t t1, time_t t2)
110 {
111         int days = 0;
112         // TODO: Very slow!!!
113         for (time_t t = t1; t < t2; t = sameTimeNextWeek(t))
114                 days++;
115         return days;
116 }
117
118 int
119 monthsBetween(time_t t1, time_t t2)
120 {
121         int months = 0;
122         // TODO: Very slow!!!
123         for (time_t t = t1; t < t2; t = sameTimeNextMonth(t))
124                 months++;
125         return months;
126 }
127
128 int 
129 dayOfMonth(time_t t)
130 {
131         struct tm* tms = localtime(&t);
132         return tms->tm_mday;
133 }
134
135 int
136 weekOfYear(time_t t)
137 {
138         time_t boy = beginOfYear(t);
139         struct tm* tms = localtime(&boy);
140         int i;
141         for (i = 0; tms->tm_wday != 0; boy = sameTimeNextDay(boy))
142                 tms = localtime(&boy);
143         // If t is in last year's week, we have to do it again for last year.
144         if (boy > t)
145         {
146                 boy = beginOfYear(sameTimeLastYear(t));
147                 tms = localtime(&boy);
148                 for (i = 0; tms->tm_wday != 0; boy = sameTimeNextDay(boy))
149                         tms = localtime(&boy);
150         }
151         tms = localtime(&t);
152         return (tms->tm_yday - i) / 7 + 1;
153 }
154
155 int 
156 monthOfYear(time_t t)
157 {
158         struct tm* tms = localtime(&t);
159         return tms->tm_mon + 1;
160 }
161
162 int
163 dayOfWeek(time_t t)
164 {
165         struct tm* tms = localtime(&t);
166         return tms->tm_wday;
167 }
168
169 int
170 year(time_t t)
171 {
172         struct tm* tms = localtime(&t);
173         return tms->tm_year + 1900;
174 }
175
176 time_t
177 midnight(time_t t)
178 {
179         struct tm* tms = localtime(&t);
180         tms->tm_sec = tms->tm_min = tms->tm_hour = 0;
181         tms->tm_isdst = -1;
182         return mktime(tms);
183 }
184
185 time_t
186 beginOfWeek(time_t t)
187 {
188         struct tm* tms;
189         for (tms = localtime(&t) ; tms->tm_wday != 0;
190                  t = sameTimeYesterday(t), tms = localtime(&t))
191                 ;
192         tms->tm_sec = tms->tm_min = tms->tm_hour = 0;
193         tms->tm_isdst = -1;
194         return mktime(tms);
195 }
196
197 time_t
198 beginOfMonth(time_t t)
199 {
200         struct tm* tms = localtime(&t);
201         tms->tm_mday = 1;
202         tms->tm_sec = tms->tm_min = tms->tm_hour = 0;
203         tms->tm_isdst = -1;
204         return mktime(tms);
205 }
206
207 time_t
208 beginOfYear(time_t t)
209 {
210         struct tm* tms = localtime(&t);
211         tms->tm_mon = 0;
212         tms->tm_mday = 1;
213         tms->tm_sec = tms->tm_min = tms->tm_hour = 0;
214         tms->tm_isdst = -1;
215         return mktime(tms);
216 }
217
218 time_t
219 sameTimeNextDay(time_t t)
220 {
221         struct tm* tms = localtime(&t);
222         tms->tm_mday++;
223         tms->tm_isdst = -1;
224         return mktime(tms);
225 }
226
227 time_t
228 sameTimeYesterday(time_t t)
229 {
230         struct tm* tms = localtime(&t);
231         tms->tm_mday--;
232         tms->tm_isdst = -1;
233         return mktime(tms);
234 }
235
236 time_t
237 sameTimeNextWeek(time_t t)
238 {
239         struct tm* tms = localtime(&t);
240         int weekday = tms->tm_wday;
241         do
242         {
243                 t = sameTimeNextDay(t);
244                 tms = localtime(&t);
245         } while (tms->tm_wday != weekday);
246         tms->tm_isdst = -1;
247         return mktime(tms);
248 }
249
250 time_t
251 sameTimeNextMonth(time_t t)
252 {
253         struct tm* tms = localtime(&t);
254         tms->tm_mon++;
255         tms->tm_isdst = -1;
256         return mktime(tms);
257 }
258
259 time_t
260 sameTimeNextYear(time_t t)
261 {
262         struct tm* tms = localtime(&t);
263         tms->tm_year++;
264         tms->tm_isdst = -1;
265         return mktime(tms);
266 }
267
268 time_t
269 sameTimeLastYear(time_t t)
270 {
271         struct tm* tms = localtime(&t);
272         tms->tm_year--;
273         tms->tm_isdst = -1;
274         return mktime(tms);
275 }
276
277 QString time2ISO(time_t t)
278 {
279         struct tm* tms = localtime(&t);
280         static char buf[128];
281
282         strftime(buf, 127, "%Y-%m-%d %H:%M %Z", tms);
283         return buf;
284 }
285
286 QString time2tjp(time_t t)
287 {
288         struct tm* tms = localtime(&t);
289         static char buf[128];
290
291         strftime(buf, 127, "%Y-%m-%d-%H:%M:%S-%Z", tms);
292         return buf;
293 }
294
295 QString time2time(time_t t)
296 {
297         struct tm* tms = localtime(&t);
298         static char buf[128];
299
300         strftime(buf, 127, "%H:%M %Z", tms);
301         return buf;
302 }
303
304 QString time2date(time_t t)
305 {
306         struct tm* tms = localtime(&t);
307         static char buf[128];
308
309         strftime(buf, 127, "%Y-%m-%d", tms);
310         return buf;
311 }
312
313 time_t
314 addTimeToDate(time_t day, time_t hour)
315 {
316         day = midnight(day);
317         struct tm* tms = localtime(&day);
318
319         tms->tm_hour = hour / (60 * 60);
320         tms->tm_min = (hour / 60) % 60;
321         tms->tm_sec = hour % 60;
322
323         tms->tm_isdst = -1;
324         return mktime(tms);
325 }
326
327
328 time_t dateToTime( const QString& date)
329 {
330         int y, m, d, hour, min;
331         if (date.find(':') == -1)
332         {
333                 sscanf(date, "%d-%d-%d", &y, &m, &d);
334                 hour = min = 0;
335         }
336         else
337                 sscanf(date, "%d-%d-%d-%d:%d", &y, &m, &d, &hour, &min);
338
339         if (y < 1970)
340         {
341                 y = 1970;
342         }
343         if (m < 1 || m > 12)
344         {
345                 m = 1;
346         }
347         if (d < 1 || d > 31)
348         {
349                 d = 1;
350         }
351
352         struct tm t = { 0, min, hour, d, m - 1, y - 1900, 0, 0, -1, 0, 0 };
353         time_t localTime = mktime(&t);
354
355         return localTime;
356 }
357