1 /////////////////////////////////////////////////////////////////////////////
2 // Name: common/timercmn.cpp
3 // Purpose: Common timer implementation
4 // Author: Julian Smart
5 // Modified by: Vadim Zeitlin on 12.11.99 to get rid of all ifdefs
8 // Copyright: (c) Julian Smart and Markus Holzem
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
12 // ============================================================================
14 // ============================================================================
16 // ----------------------------------------------------------------------------
18 // ----------------------------------------------------------------------------
21 #pragma implementation "timerbase.h"
24 // For compilers that support precompilation, includes "wx.h".
25 #include "wx/wxprec.h"
38 // I'm told VMS is POSIX, so should have localtime()
39 #if defined(__WXMSW__) || defined(__VMS__)
40 // configure might have found it already for us
41 #ifndef HAVE_LOCALTIME
42 #define HAVE_LOCALTIME
46 // TODO: #define WX_GMTOFF_IN_TM for Windows compilers which have it here
48 #if defined(__WIN32__) && !defined(WX_GMTOFF_IN_TM)
52 #if defined(HAVE_GETTIMEOFDAY)
55 #elif defined(HAVE_LOCALTIME)
58 #include <sys/types.h> // for time_t
60 #elif defined(HAVE_FTIME)
61 #include <sys/timeb.h>
63 #error "no function to find the current time on this system"
66 // ----------------------------------------------------------------------------
68 // ----------------------------------------------------------------------------
70 // on some really old systems gettimeofday() doesn't have the second argument,
71 // define wxGetTimeOfDay() to hide this difference
72 #ifdef HAVE_GETTIMEOFDAY
73 #ifdef WX_GETTIMEOFDAY_NO_TZ
75 #define wxGetTimeOfDay(tv, tz) gettimeofday(tv)
77 #define wxGetTimeOfDay(tv, tz) gettimeofday((tv), (tz))
79 #endif // HAVE_GETTIMEOFDAY
81 // ============================================================================
83 // ============================================================================
85 // ----------------------------------------------------------------------------
87 // ----------------------------------------------------------------------------
89 void wxStopWatch::Start(long t
)
91 m_t0
= wxGetCurrentMTime() - t
;
96 long wxStopWatch::Time() const
98 return m_pause
? m_pause
: GetElapsedTime();
101 // ----------------------------------------------------------------------------
102 // old timer functions superceded by wxStopWatch
103 // ----------------------------------------------------------------------------
105 static long wxStartTime
= 0;
107 // starts the global timer
110 wxStartTime
= wxGetCurrentMTime();
113 // Returns elapsed time in milliseconds
114 long wxGetElapsedTime(bool resetTimer
)
116 long oldTime
= wxStartTime
;
117 long newTime
= wxGetCurrentMTime();
120 wxStartTime
= newTime
;
122 return newTime
- oldTime
;
126 // Get number of seconds since 00:00:00 GMT, Jan 1st 1970.
127 long wxGetCurrentTime()
129 return wxGetCurrentMTime() / 1000;
132 // ----------------------------------------------------------------------------
133 // the functions to get the current time and timezone info
134 // ----------------------------------------------------------------------------
136 // return GMT time in millisecond
137 long wxGetCurrentMTime()
139 #if defined(HAVE_LOCALTIME)
140 time_t t0
= time(&t0
);
141 if ( t0
!= (time_t)-1 )
143 struct tm
*tp
= localtime(&t0
);
147 return 1000*(60*(60*tp
->tm_hour
+tp
->tm_min
)+tp
->tm_sec
);
150 #elif defined(HAVE_GETTIMEOFDAY)
152 if ( wxGetTimeOfDay(&tp
, (struct timezone
*)NULL
) != -1 )
154 return (1000*tp
.tv_sec
+ tp
.tv_usec
/ 1000);
156 #elif defined(HAVE_FTIME)
158 if ( ftime(&tp
) == 0 )
160 return (1000*tp
.time
+ tp
.millitm
);
163 #error "no function to find the current time on this system"
166 wxLogSysError(_("Failed to get the system time"));
171 bool wxGetLocalTime(long *timeZone
, int *dstObserved
)
173 #if defined(HAVE_LOCALTIME) && defined(WX_GMTOFF_IN_TM)
174 time_t t0
= time(&t0
);
175 if ( t0
!= (time_t)-1 )
177 struct tm
*tm
= localtime(&t0
);
181 *timeZone
= tm
->tm_gmtoff
;
182 *dstObserved
= tm
->tm_isdst
;
187 #elif defined(HAVE_GETTIMEOFDAY) && !defined(WX_GETTIMEOFDAY_NO_TZ)
190 if ( gettimeofday(&tp
, &tz
) != -1 )
192 *timeZone
= 60*tz
.tz_minuteswest
;
193 *dstObserved
= tz
.tz_dsttime
;
197 #elif defined(HAVE_FTIME)
199 if ( ftime(&tb
) == 0 )
201 *timeZone
= 60*tb
.timezone
;
202 *dstObserved
= tb
.dstflag
;
204 #else // no standard function return tz info
205 // special hacks for known compilers
206 #if defined(__BORLANDC__) || defined(__VISUALC__)
207 *timeZone
= _timezone
;
208 *dstObserved
= _daylight
;
209 #elif defined(__SALFORDC__)
210 *timeZone
= _timezone
;
211 *dstObserved
= daylight
;
212 #elif defined(__VISAGECPP__)
213 *timeZone
= _timezone
;
214 *dstObserved
= daylight
;
215 #elif defined(__WIN32__)
216 TIME_ZONE_INFORMATION tzInfo
;
217 switch ( GetTimeZoneInformation(&tzInfo
) )
220 wxFAIL_MSG(_T("unknown GetTimeZoneInformation return code"));
223 case TIME_ZONE_ID_UNKNOWN
:
224 case TIME_ZONE_ID_STANDARD
:
225 *dstObserved
= FALSE
;
228 case TIME_ZONE_ID_DAYLIGHT
:
233 *timeZone
= 60*tzInfo
.Bias
;
235 wxFAIL_MSG(_T("wxGetLocalTime() not implemented"));
237 #endif // all ways in the known Universe to get tz info