3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS system libraries
5 * FILE: lib/kernel32/misc/time.c
6 * PURPOSE: Time conversion functions
7 * PROGRAMMER: Boudewijn ( ariadne@xs4all.nl)
8 * DOSDATE and DOSTIME structures from Onno Hovers
13 /* INCLUDES ******************************************************************/
18 #include <kernel32/kernel32.h>
20 /* TYPES *********************************************************************/
22 typedef struct __DOSTIME
29 typedef struct __DOSDATE
36 #define TICKSPERMIN 600000000
38 /* FUNCTIONS ****************************************************************/
42 FileTimeToDosDateTime(
43 CONST FILETIME *lpFileTime,
48 PDOSTIME pdtime=(PDOSTIME) lpFatTime;
49 PDOSDATE pddate=(PDOSDATE) lpFatDate;
50 SYSTEMTIME SystemTime;
52 if ( lpFileTime == NULL )
55 if ( lpFatDate == NULL )
58 if ( lpFatTime == NULL )
66 pdtime->Second = SystemTime.wSecond;
67 pdtime->Minute = SystemTime.wMinute;
68 pdtime->Hour = SystemTime.wHour;
70 pddate->Day = SystemTime.wDay;
71 pddate->Month = SystemTime.wMonth;
72 pddate->Year = SystemTime.wYear - 1980;
79 DosDateTimeToFileTime(
85 PDOSTIME pdtime = (PDOSTIME) &wFatTime;
86 PDOSDATE pddate = (PDOSDATE) &wFatDate;
87 SYSTEMTIME SystemTime;
89 if ( lpFileTime == NULL )
92 SystemTime.wMilliseconds = 0;
93 SystemTime.wSecond = pdtime->Second;
94 SystemTime.wMinute = pdtime->Minute;
95 SystemTime.wHour = pdtime->Hour;
97 SystemTime.wDay = pddate->Day;
98 SystemTime.wMonth = pddate->Month;
99 SystemTime.wYear = 1980 + pddate->Year;
101 SystemTimeToFileTime(&SystemTime,lpFileTime);
109 CONST FILETIME *lpFileTime1,
110 CONST FILETIME *lpFileTime2
113 if ( lpFileTime1 == NULL )
115 if ( lpFileTime2 == NULL )
118 if (*((PLONGLONG)lpFileTime1) > *((PLONGLONG)lpFileTime2))
120 else if (*((PLONGLONG)lpFileTime1) < *((PLONGLONG)lpFileTime2))
128 GetSystemTimeAsFileTime(PFILETIME lpFileTime)
130 NtQuerySystemTime ((TIME *)lpFileTime);
135 SystemTimeToFileTime(
136 CONST SYSTEMTIME * lpSystemTime,
137 LPFILETIME lpFileTime
141 TIME_FIELDS TimeFields;
142 LARGE_INTEGER liTime;
144 TimeFields.Year = lpSystemTime->wYear;
145 TimeFields.Month = lpSystemTime->wMonth;
146 TimeFields.Day = lpSystemTime->wDay;
147 TimeFields.Hour = lpSystemTime->wHour;
148 TimeFields.Minute = lpSystemTime->wMinute;
149 TimeFields.Second = lpSystemTime->wSecond;
150 TimeFields.Milliseconds = lpSystemTime->wMilliseconds;
152 if (RtlTimeFieldsToTime (&TimeFields, &liTime))
154 lpFileTime->dwLowDateTime = liTime.u.LowPart;
155 lpFileTime->dwHighDateTime = liTime.u.HighPart;
161 // dwDayOfWeek = RtlLargeIntegerDivide(FileTime,LIDAY,&dwRemDay);
162 // lpSystemTime->wDayOfWeek = 1 + GET_LARGE_INTEGER_LOW_PART(dwDayOfWeek) % 7;
168 FileTimeToSystemTime(
169 CONST FILETIME *lpFileTime,
170 LPSYSTEMTIME lpSystemTime
173 TIME_FIELDS TimeFields;
174 LARGE_INTEGER liTime;
176 if(lpFileTime->dwHighDateTime & 0x80000000)
179 liTime.u.LowPart = lpFileTime->dwLowDateTime;
180 liTime.u.HighPart = lpFileTime->dwHighDateTime;
182 RtlTimeToTimeFields(&liTime, &TimeFields);
184 lpSystemTime->wYear = TimeFields.Year;
185 lpSystemTime->wMonth = TimeFields.Month;
186 lpSystemTime->wDay = TimeFields.Day;
187 lpSystemTime->wHour = TimeFields.Hour;
188 lpSystemTime->wMinute = TimeFields.Minute;
189 lpSystemTime->wSecond = TimeFields.Second;
190 lpSystemTime->wMilliseconds = TimeFields.Milliseconds;
191 lpSystemTime->wDayOfWeek = TimeFields.Weekday;
199 FileTimeToLocalFileTime(
200 CONST FILETIME *lpFileTime,
201 LPFILETIME lpLocalFileTime
204 // FIXME: include time bias
205 *((PLONGLONG)lpLocalFileTime) = *((PLONGLONG)lpFileTime);
212 LocalFileTimeToFileTime(
213 CONST FILETIME *lpLocalFileTime,
214 LPFILETIME lpFileTime
217 // FIXME: include time bias
218 *((PLONGLONG)lpFileTime) = *((PLONGLONG)lpLocalFileTime);
225 GetLocalTime(LPSYSTEMTIME lpSystemTime)
228 FILETIME LocalFileTime;
230 NtQuerySystemTime ((TIME*)&FileTime);
231 FileTimeToLocalFileTime (&FileTime, &LocalFileTime);
232 FileTimeToSystemTime (&LocalFileTime, lpSystemTime);
237 GetSystemTime(LPSYSTEMTIME lpSystemTime)
241 NtQuerySystemTime ((TIME*)&FileTime);
242 FileTimeToSystemTime (&FileTime, lpSystemTime);
247 SetLocalTime(CONST SYSTEMTIME *lpSystemTime)
249 FILETIME LocalFileTime;
250 LARGE_INTEGER FileTime;
253 SystemTimeToFileTime (lpSystemTime, &LocalFileTime);
254 LocalFileTimeToFileTime (&LocalFileTime, (FILETIME *)&FileTime);
255 errCode = NtSetSystemTime (&FileTime, &FileTime);
256 if (!NT_SUCCESS(errCode))
263 SetSystemTime(CONST SYSTEMTIME *lpSystemTime)
265 LARGE_INTEGER NewSystemTime;
268 SystemTimeToFileTime (lpSystemTime, (PFILETIME)&NewSystemTime);
269 errCode = NtSetSystemTime (&NewSystemTime, &NewSystemTime);
270 if (!NT_SUCCESS(errCode))
277 GetTimeZoneInformation(LPTIME_ZONE_INFORMATION lpTimeZoneInformation)
279 TIME_ZONE_INFORMATION TimeZoneInformation;
282 DPRINT("GetTimeZoneInformation()\n");
284 Status = NtQuerySystemInformation(SystemCurrentTimeZoneInformation,
285 &TimeZoneInformation,
286 sizeof(TIME_ZONE_INFORMATION),
288 if (!NT_SUCCESS(Status))
290 SetLastErrorByStatus(Status);
291 return TIME_ZONE_ID_INVALID;
294 memcpy(lpTimeZoneInformation,
295 &TimeZoneInformation,
296 sizeof(TIME_ZONE_INFORMATION));
298 return(SharedUserData->TimeZoneId);
303 SetTimeZoneInformation(CONST TIME_ZONE_INFORMATION *lpTimeZoneInformation)
305 TIME_ZONE_INFORMATION TimeZoneInformation;
308 DPRINT("SetTimeZoneInformation()\n");
310 memcpy(&TimeZoneInformation,
311 lpTimeZoneInformation,
312 sizeof(TIME_ZONE_INFORMATION));
314 Status = RtlSetTimeZoneInformation(&TimeZoneInformation);
315 if (!NT_SUCCESS(Status))
317 SetLastErrorByStatus(Status);
321 NtSetSystemTime(0,0);
330 return GetTickCount();
338 NtGetTickCount(&UpTime);
344 SystemTimeToTzSpecificLocalTime(
345 LPTIME_ZONE_INFORMATION lpTimeZoneInformation,
346 LPSYSTEMTIME lpUniversalTime,
347 LPSYSTEMTIME lpLocalTime
350 TIME_ZONE_INFORMATION TimeZoneInformation;
351 LPTIME_ZONE_INFORMATION lpTzInfo;
352 LARGE_INTEGER FileTime;
354 if (!lpTimeZoneInformation)
356 GetTimeZoneInformation (&TimeZoneInformation);
357 lpTzInfo = &TimeZoneInformation;
360 lpTzInfo = lpTimeZoneInformation;
362 if (!lpUniversalTime)
368 SystemTimeToFileTime (lpUniversalTime, (PFILETIME)&FileTime);
369 FileTime.QuadPart -= (lpTzInfo->Bias * TICKSPERMIN);
370 FileTimeToSystemTime ((PFILETIME)&FileTime, lpLocalTime);
377 GetSystemTimeAdjustment(PDWORD lpTimeAdjustment,
378 PDWORD lpTimeIncrement,
379 PWINBOOL lpTimeAdjustmentDisabled)
381 SYSTEM_QUERY_TIME_ADJUSTMENT Buffer;
384 Status = NtQuerySystemInformation(SystemTimeAdjustmentInformation,
386 sizeof(SYSTEM_QUERY_TIME_ADJUSTMENT),
388 if (!NT_SUCCESS(Status))
390 SetLastErrorByStatus(Status);
394 *lpTimeAdjustment = (DWORD)Buffer.TimeAdjustment;
395 *lpTimeIncrement = (DWORD)Buffer.MaximumIncrement;
396 *lpTimeAdjustmentDisabled = (WINBOOL)Buffer.TimeSynchronization;
403 SetSystemTimeAdjustment(DWORD dwTimeAdjustment,
404 WINBOOL bTimeAdjustmentDisabled)
407 SYSTEM_TIME_ADJUSTMENT_INFO Buffer;
409 Buffer.TimeAdjustment = (ULONG)dwTimeAdjustment;
410 Buffer.TimeSynchronization = (BOOLEAN)bTimeAdjustmentDisabled;
412 Status = NtSetSystemInformation(SystemTimeAdjustmentInformation,
414 sizeof(SYSTEM_TIME_ADJUSTMENT_INFO));
415 if (!NT_SUCCESS(Status))
417 SetLastErrorByStatus(Status);