1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/msw/wince/time.cpp
3 // Purpose: Implements missing time functionality for WinCE
4 // Author: Marco Cavallini (MCK) - wx@koansoftware.com
8 // Copyright: (c) Marco Cavallini
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 // ===========================================================================
14 // ===========================================================================
16 // ---------------------------------------------------------------------------
18 // ---------------------------------------------------------------------------
20 #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
21 #pragma implementation "window.h"
24 // For compilers that support precompilation, includes "wx.h".
25 #include "wx/wxprec.h"
32 #include "wx/msw/wrapwin.h"
35 #include "wx/msw/wince/time.h"
38 #define is_leap(y) (y % 4 == 0 && (y % 100 != 0 || y % 400 == 0))
39 #define SECONDS_IN_ONE_MINUTE 60
40 #define DAYS_IN_ONE_YEAR 365
41 #define SECONDS_IN_ONE_MIN 60
42 #define SECONDS_IN_ONE_HOUR 3600
43 #define SECONDS_IN_ONE_DAY 86400
44 #define DEFAULT_TIMEZONE 28800
46 #define DO_LOCALTIME 1
49 long timezone
; // global variable
52 ////////////////////////////////////////////////////////////////////////
53 // Common code for localtime and gmtime (static)
54 ////////////////////////////////////////////////////////////////////////
56 static struct tm
* __cdecl
common_localtime(const time_t *t
, BOOL bLocal
)
61 SYSTEMTIME SystemTime
;
62 TIME_ZONE_INFORMATION pTz
;
63 static struct tm st_res
; // data holder
64 static struct tm
* res
= &st_res
; // data pointer
66 const unsigned short int __mon_yday
[2][13] =
69 { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 },
71 { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 }
75 ::GetLocalTime(&SystemTime
);
79 i64
= i64
* 10000000 + 116444736000000000;
81 ft
.dwLowDateTime
= i64
.GetLo();
82 ft
.dwHighDateTime
= i64
.GetHi();
84 ::FileTimeToSystemTime(&ft
, &SystemTime
);
87 ::GetTimeZoneInformation(&pTz
);
89 ///////////////////////////////////////////////
91 timezone
= pTz
.Bias
* SECONDS_IN_ONE_MINUTE
;
92 ///////////////////////////////////////////////
94 iLeap
= is_leap(SystemTime
.wYear
) ;
96 res
->tm_hour
= SystemTime
.wHour
;
97 res
->tm_min
= SystemTime
.wMinute
;
98 res
->tm_sec
= SystemTime
.wSecond
;
100 res
->tm_mday
= SystemTime
.wDay
;
101 res
->tm_mon
= SystemTime
.wMonth
- 1; // this the correct month but localtime returns month aligned to zero
102 res
->tm_year
= SystemTime
.wYear
; // this the correct year
103 res
->tm_year
= res
->tm_year
- 1900; // but localtime returns the value starting at the 1900
105 res
->tm_wday
= SystemTime
.wDayOfWeek
;
106 res
->tm_yday
= __mon_yday
[iLeap
][res
->tm_mon
] + SystemTime
.wDay
- 1; // localtime returns year-day aligned to zero
108 // if localtime behavior and daylight saving
109 if (bLocal
&& pTz
.DaylightBias
!= 0)
112 res
->tm_isdst
= 0; // without daylight saving or gmtime
120 ////////////////////////////////////////////////////////////////////////
121 // Receive the number of seconds elapsed since midnight(00:00:00)
122 // and convert a time value and corrects for the local time zone
123 ////////////////////////////////////////////////////////////////////////
124 struct tm
* __cdecl
localtime(const time_t * t
)
126 return common_localtime(t
, DO_LOCALTIME
) ;
129 ////////////////////////////////////////////////////////////////////////
130 // Receives the number of seconds elapsed since midnight(00:00:00)
131 // and converts a time value WITHOUT correcting for the local time zone
132 ////////////////////////////////////////////////////////////////////////
133 struct tm
* __cdecl
gmtime(const time_t *t
)
135 return common_localtime(t
, DO_GMTIME
) ;
140 ////////////////////////////////////////////////////////////////////////
141 // Common code for conversion of struct tm into time_t (static)
142 ////////////////////////////////////////////////////////////////////////
143 static time_t __cdecl
common_tm_to_time(int day
, int month
, int year
, int hour
, int minute
, int second
)
146 static int mdays
[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 } ;
150 prog
+= mdays
[month
- 1] ;
151 if (month
== 2 && is_leap(year
))
155 // Calculate seconds in elapsed days
156 prog
= day
- 1 ; // align first day of the year to zero
157 prog
+= (DAYS_IN_ONE_YEAR
* (year
- 1970) + (year
- 1901) / 4 - 19) ;
158 prog
*= SECONDS_IN_ONE_DAY
;
160 // Add Calculated elapsed seconds in the current day
161 prog
+= (hour
* SECONDS_IN_ONE_HOUR
+ minute
*
162 SECONDS_IN_ONE_MIN
+ second
) ;
170 ////////////////////////////////////////////////////////////////////////
171 // Returns the number of seconds elapsed since
172 // midnight(00:00:00) of 1 January 1970
173 ////////////////////////////////////////////////////////////////////////
174 time_t __cdecl
time(time_t *t
)
180 SYSTEMTIME SystemTime
;
182 ::GetLocalTime(&SystemTime
) ;
183 prog
= common_tm_to_time(SystemTime
.wDay
, SystemTime
.wMonth
, SystemTime
.wYear
,
184 SystemTime
.wHour
, SystemTime
.wMinute
, SystemTime
.wSecond
) ;
191 ////////////////////////////////////////////////////////////////////////
192 // Converts the local time provided by struct tm
193 // into a time_t calendar value
194 ////////////////////////////////////////////////////////////////////////
195 time_t __cdecl
mktime(struct tm
*t
)
197 return (common_tm_to_time(t
->tm_mday
, t
->tm_mon
+1, t
->tm_year
+1900, t
->tm_hour
, t
->tm_min
, t
->tm_sec
)) ;
201 size_t __cdecl
wcsftime(wchar_t *, size_t, const wchar_t *, const struct tm
*)
203 // TODO : maybe copy something from wxString::Printf