]> git.saurik.com Git - wxWidgets.git/blame - src/common/time.cpp
speed optimizations: some functions now use wxString::Alloc, wxTextFile::Read
[wxWidgets.git] / src / common / time.cpp
CommitLineData
c801d85f
KB
1/////////////////////////////////////////////////////////////////////////////
2// Name: time.cpp
3// Purpose: wxTime class, from NIHCL
4// Author: Julian Smart, after K. E. Gorlen
5// Modified by:
6// Created: 04/01/98
7// RCS-ID: $Id$
8// Copyright: (c) Julian Smart and Markus Holzem
9// Licence: wxWindows license
10/////////////////////////////////////////////////////////////////////////////
11
12#ifdef __GNUG__
13#pragma implementation "time.h"
14#endif
15
16/*
17Provides an object that represents a Time, stored as the number of
18seconds since January 1, 1901, GMT.
19*/
20
21// For compilers that support precompilation, includes "wx.h".
22#include "wx/wxprec.h"
23
24#ifdef __BORLANDC__
25#pragma hdrstop
26#endif
27
28#include "wx/setup.h"
29
30#if USE_TIMEDATE
31
32#include "wx/time.h"
33#include "wx/date.h"
34#include "wx/utils.h"
35
36#if USE_IOSTREAMH
37#include <iostream.h>
38#else
39#include <iostream>
40#endif
41
42#include <iomanip.h>
43#include <string.h>
44
45#if !USE_SHARED_LIBRARY
46IMPLEMENT_DYNAMIC_CLASS(wxTime, wxObject)
47#endif
48
49
50extern bool wxGetLocalTime(long *timeZone, int *dstObserved);
51extern long wxGetCurrentTime(void);
52
53static long TIME_ZONE; /* seconds west of GMT */
54static int DST_OBSERVED; /* flags U.S. daylight saving time observed */
55
56static bool wxTimeInitialized = FALSE;
57
58wxTime::tFormat wxTime::Format = wxTime::wx12h;
59wxTime::tPrecision wxTime::Precision = wxTime::wxStdMinSec;
60
61static const unsigned long seconds_in_day = 24*60*60L;
62static const wxDate refDate(1,1,1901);
63// static const wxDate maxDate(49709L); /* ((2**32)-1)/seconds_in_day -1 */
64
65wxTime wxTime::GetLocalTime(const wxDate& date, hourTy h, minuteTy m, secondTy s)
66/*
67 Return a local wxTime for the specified Standard Time date, hour, minute,
68 and second.
69*/
70{
71 if (!wxTimeInitialized)
72 {
73 wxGetLocalTime(&TIME_ZONE, &DST_OBSERVED);
74 wxTimeInitialized = TRUE;
75 }
76/*
77 if (!date.IsBetween(refDate,maxDate))
78 setError(NIHCL_DATERANGE,DEFAULT,
79 date.dayOfMonth(),date.nameOfMonth(),date.year());
80*/
81 // The following line causes an error in GCC 2.1
82// long daysBetween = date-refDate;
83 // ... but this seems to get round it.
84 wxDate tmp1(date);
85 wxDate tmp2(refDate);
86 long daysBetween = tmp1 - tmp2;
87
88 return wxTime(seconds_in_day*daysBetween + 60*60L*h + 60*m + s);
89}
90
91wxTime::wxTime()
92/*
93 Construct a wxTime for this instant.
94*/
95{
96 if (!wxTimeInitialized)
97 {
98 wxGetLocalTime(&TIME_ZONE, &DST_OBSERVED);
99 wxTimeInitialized = TRUE;
100 }
101 sec = wxGetCurrentTime();
1f0299c1 102 sec += 2177452800UL; /* seconds from 1/1/01 to 1/1/70 */
c801d85f
KB
103}
104
105wxTime::wxTime(hourTy h, minuteTy m, secondTy s, bool dst)
106/*
107 Construct a wxTime for today at the specified (local) hour, minute, and
108 second.
109*/
110{
111 if (!wxTimeInitialized)
112 {
113 wxGetLocalTime(&TIME_ZONE, &DST_OBSERVED);
114 wxTimeInitialized = TRUE;
115 }
116
117 sec = wxTime(wxDate(),h,m,s,dst).sec;
118}
119
120
121wxTime::wxTime(const wxDate& date, hourTy h, minuteTy m, secondTy s, bool dst)
122/*
123 Construct a wxTime for the specified (local) Date, hour, minute, and
124 second.
125*/
126{
127 if (!wxTimeInitialized)
128 {
129 wxGetLocalTime(&TIME_ZONE, &DST_OBSERVED);
130 wxTimeInitialized = TRUE;
131 }
132 sec = GetLocalTime(date,h,m,s).sec-3600;
133 if (IsDST())
134 {
135 sec += 3600;
136 if (IsDST() || dst) sec -= 3600;
137 }
138 else
139 {
140 sec += 3600;
141/*
142 if (IsDST()) setError(NIHCL_BADTIME,DEFAULT,
143 date.dayOfMonth(),date.nameOfMonth(),date.year(),
144 h,m,s,(dst?"DST":""));
145*/
146 }
147 sec += TIME_ZONE; // adjust to GMT
148}
149
150wxTime::operator wxDate() const
151/*
152 Convert a wxTime to a local wxDate
153*/
154{
155// return wxDate((int)(GetLocalTime().sec/seconds_in_day)); 4.2 cc bug
156 long daycount = (long)(GetLocalTime().sec/seconds_in_day);
157
158 wxDate date(1,1,1901);
159 date += daycount;
160 return date;
161}
162
163bool wxTime::IsBetween(const wxTime& a, const wxTime& b) const
164{
165 return *this >= a && *this <= b;
166}
167
168hourTy wxTime::GetHour() const
169/*
170 Return the hour of this wxTime in local time; i.e., adjust for
171 time zone and Daylight Savings Time.
172*/
173{
174 return GetLocalTime().GetHourGMT();
175}
176
177hourTy wxTime::GetHourGMT() const
178/*
179 Return the hour of this Time in GMT.
180*/
181{
182 return (hourTy)((sec % 86400) / 3600);
183}
184
185wxTime wxTime::GetBeginDST(unsigned year)
186/*
187 Return the local Standard Time at which Daylight Savings Time
188 begins in the specified year.
189*/
190{
191 // Previous Sunday
192 wxTime DSTtime(GetLocalTime(wxDate(3,31,year).Previous(1)+7,2));
193 if (year<=1986) {
194 // Previous Sunday
195 DSTtime = GetLocalTime(wxDate(4,30,year).Previous(1),2);
196 if (year==1974) DSTtime = GetLocalTime(wxDate(1,6,1974),2);
197 if (year==1975) DSTtime = GetLocalTime(wxDate(2,23,1975),2);
198 }
199 return DSTtime;
200}
201
202wxTime wxTime::GetEndDST(unsigned year)
203/*
204 Return the local Standard Time at which Daylight Savings Time
205 ends in the specified year.
206*/
207{
208 wxTime STDtime(GetLocalTime(wxDate(10,31,year).Previous(1),2-1));
209 return STDtime;
210}
211
212bool wxTime::IsDST() const
213/*
214 Return TRUE if this local Standard Time should be adjusted
215 for Daylight Savings Time.
216*/
217{
218 long daycount = (long)(sec/seconds_in_day);
219
220 // At this point, daycount is the number of days from 1/1/1901.
221 // Need to convert to julian date (which starts at 1/1/4713 B.C.)
222 wxDate date(1,1,1901);
223 date += daycount;
224
225 unsigned year = date.GetYear();
226 if (DST_OBSERVED)
227 {
228 if (*this >= GetBeginDST(year))
229 if (*this < GetEndDST(year)) return TRUE;
230 }
231 return FALSE;
232}
233
234wxTime wxTime::GetLocalTime() const
235/*
236 Adjusts this GM Time for local time zone and Daylight Savings Time.
237*/
238{
239 wxTime local_time(sec-TIME_ZONE);
240 if (local_time.IsDST()) local_time.sec += 3600;
241 return local_time;
242}
243
244minuteTy wxTime::GetMinute() const
245/*
246 Return the minute of this wxTime in local time; i.e., adjust
247 for time zone and Daylight Savings Time.
248*/
249{
250 return GetLocalTime().GetMinuteGMT();
251}
252
253minuteTy wxTime::GetMinuteGMT() const
254/*
255 Return the minute of this wxTime in GMT.
256*/
257{
258 return (minuteTy)(((sec % 86400) % 3600) / 60);
259}
260
261secondTy wxTime::GetSecond() const
262/*
263 Return the second of this wxTime.
264*/
265{
266 return (secondTy)(((sec % 86400) % 3600) % 60);
267}
268
269wxTime wxTime::Max(const wxTime& t) const
270{
271 if (t < *this) return *this;
272 return t;
273}
274
275wxTime wxTime::Min(const wxTime& t) const
276{
277 if (t > *this) return *this;
278 return t;
279}
280
281wxTime::operator char *(void)
282{
283 return FormatTime();
284}
285
286void wxTime::SetFormat(const wxTime::tFormat lFormat,
287 const wxTime::tPrecision lPrecision) {
288
289 wxTime::Format = lFormat;
290 wxTime::Precision = lPrecision;
291}
292
293char *wxTime::FormatTime() const {
294 static char timeBuf[30];
295 unsigned hh(GetHour());
296
297 switch (Format) {
298 case wx12h:
299 hh -= 12;
300 break;
301 case wx24h:
302 break;
303 }
304
305 switch (Precision) {
306 case wxStdMinSec:
307 sprintf(timeBuf,"%2d:%02d:%02d",hh,GetMinute(),GetSecond());
308 break;
309 case wxStdMin:
310 sprintf(timeBuf,"%2d:%02d",hh,GetMinute());
311 break;
312 }
313
314 if (Format == wx12h)
315 if (GetHour() <= 12)
316 strcat(timeBuf,"am");
317 else
318 strcat(timeBuf,"pm");
319
320 return timeBuf;
321}
322
323/*
324int wxTime::compare(const Object& ob) const
325{
326 assertArgSpecies(ob,classDesc,"compare");
327 register clockTy t = castdown(ob).sec;
328 if (sec < t) return -1;
329 if (sec > t) return 1;
330 return 0;
331}
332
333void wxTime::deepenShallowCopy() {}
334
335unsigned wxTime::hash() const { return sec; }
336
337bool wxTime::isEqual(const Object& ob) const
338{
339 return ob.isSpecies(classDesc) && *this==castdown(ob);
340}
341
342const Class* wxTime::species() const { return &classDesc; }
343
344void wxTime::printOn(ostream& strm) const
345{
346 register unsigned hh = GetHour();
347 wxDate(*this).printOn(strm);
348 strm << ' ' << ((hh <= 12) ? hh : hh-12) << ':'
349 << setfill('0') << setw(2) << GetMinute() << ':'
350 << setfill('0') << setw(2) << GetSecond() << ' ';
351 if (hh < 12) strm << "am";
352 else strm << "pm";
353}
354
355wxTime::wxTime(OIOin& strm)
356 : BASE(strm)
357{
358 unsigned long usec;
359 strm >> sec >> usec;
360}
361
362void wxTime::storer(OIOout& strm) const
363{
364 BASE::storer(strm);
365 strm << sec << 0l;
366}
367
368
369wxTime::wxTime(OIOifd& fd)
370 : BASE(fd)
371{
372 unsigned long usec;
373 fd >> sec >> usec;
374}
375
376void wxTime::storer(OIOofd& fd) const
377{
378 BASE::storer(fd);
379 fd << sec << 0l;
380}
381*/
382
383#endif