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 ****************************************************************/
45 FileTimeToDosDateTime(
46 CONST FILETIME *lpFileTime,
51 PDOSTIME pdtime=(PDOSTIME) lpFatTime;
52 PDOSDATE pddate=(PDOSDATE) lpFatDate;
53 SYSTEMTIME SystemTime;
55 if ( lpFileTime == NULL )
58 if ( lpFatDate == NULL )
61 if ( lpFatTime == NULL )
69 pdtime->Second = SystemTime.wSecond;
70 pdtime->Minute = SystemTime.wMinute;
71 pdtime->Hour = SystemTime.wHour;
73 pddate->Day = SystemTime.wDay;
74 pddate->Month = SystemTime.wMonth;
75 pddate->Year = SystemTime.wYear - 1980;
86 DosDateTimeToFileTime(
92 PDOSTIME pdtime = (PDOSTIME) &wFatTime;
93 PDOSDATE pddate = (PDOSDATE) &wFatDate;
94 SYSTEMTIME SystemTime;
96 if ( lpFileTime == NULL )
99 SystemTime.wMilliseconds = 0;
100 SystemTime.wSecond = pdtime->Second;
101 SystemTime.wMinute = pdtime->Minute;
102 SystemTime.wHour = pdtime->Hour;
104 SystemTime.wDay = pddate->Day;
105 SystemTime.wMonth = pddate->Month;
106 SystemTime.wYear = 1980 + pddate->Year;
108 SystemTimeToFileTime(&SystemTime,lpFileTime);
120 CONST FILETIME *lpFileTime1,
121 CONST FILETIME *lpFileTime2
124 if ( lpFileTime1 == NULL )
126 if ( lpFileTime2 == NULL )
129 if (*((PLONGLONG)lpFileTime1) > *((PLONGLONG)lpFileTime2))
131 else if (*((PLONGLONG)lpFileTime1) < *((PLONGLONG)lpFileTime2))
142 GetSystemTimeAsFileTime (PFILETIME lpFileTime)
144 NtQuerySystemTime ((PLARGE_INTEGER)lpFileTime);
153 SystemTimeToFileTime(
154 CONST SYSTEMTIME * lpSystemTime,
155 LPFILETIME lpFileTime
159 TIME_FIELDS TimeFields;
160 LARGE_INTEGER liTime;
162 TimeFields.Year = lpSystemTime->wYear;
163 TimeFields.Month = lpSystemTime->wMonth;
164 TimeFields.Day = lpSystemTime->wDay;
165 TimeFields.Hour = lpSystemTime->wHour;
166 TimeFields.Minute = lpSystemTime->wMinute;
167 TimeFields.Second = lpSystemTime->wSecond;
168 TimeFields.Milliseconds = lpSystemTime->wMilliseconds;
170 if (RtlTimeFieldsToTime (&TimeFields, &liTime))
172 lpFileTime->dwLowDateTime = liTime.u.LowPart;
173 lpFileTime->dwHighDateTime = liTime.u.HighPart;
185 FileTimeToSystemTime(
186 CONST FILETIME *lpFileTime,
187 LPSYSTEMTIME lpSystemTime
190 TIME_FIELDS TimeFields;
191 LARGE_INTEGER liTime;
193 if(lpFileTime->dwHighDateTime & 0x80000000)
196 liTime.u.LowPart = lpFileTime->dwLowDateTime;
197 liTime.u.HighPart = lpFileTime->dwHighDateTime;
199 RtlTimeToTimeFields(&liTime, &TimeFields);
201 lpSystemTime->wYear = TimeFields.Year;
202 lpSystemTime->wMonth = TimeFields.Month;
203 lpSystemTime->wDay = TimeFields.Day;
204 lpSystemTime->wHour = TimeFields.Hour;
205 lpSystemTime->wMinute = TimeFields.Minute;
206 lpSystemTime->wSecond = TimeFields.Second;
207 lpSystemTime->wMilliseconds = TimeFields.Milliseconds;
208 lpSystemTime->wDayOfWeek = TimeFields.Weekday;
219 FileTimeToLocalFileTime(
220 CONST FILETIME *lpFileTime,
221 LPFILETIME lpLocalFileTime
224 // FIXME: include time bias
225 *((PLONGLONG)lpLocalFileTime) = *((PLONGLONG)lpFileTime);
236 LocalFileTimeToFileTime(
237 CONST FILETIME *lpLocalFileTime,
238 LPFILETIME lpFileTime
241 // FIXME: include time bias
242 *((PLONGLONG)lpFileTime) = *((PLONGLONG)lpLocalFileTime);
252 GetLocalTime(LPSYSTEMTIME lpSystemTime)
255 FILETIME LocalFileTime;
257 NtQuerySystemTime ((PLARGE_INTEGER)&FileTime);
258 FileTimeToLocalFileTime (&FileTime, &LocalFileTime);
259 FileTimeToSystemTime (&LocalFileTime, lpSystemTime);
267 GetSystemTime(LPSYSTEMTIME lpSystemTime)
271 NtQuerySystemTime ((PLARGE_INTEGER)&FileTime);
272 FileTimeToSystemTime (&FileTime, lpSystemTime);
280 SetLocalTime(CONST SYSTEMTIME *lpSystemTime)
282 FILETIME LocalFileTime;
283 LARGE_INTEGER FileTime;
286 SystemTimeToFileTime (lpSystemTime, &LocalFileTime);
287 LocalFileTimeToFileTime (&LocalFileTime, (FILETIME *)&FileTime);
288 errCode = NtSetSystemTime (&FileTime, &FileTime);
289 if (!NT_SUCCESS(errCode))
299 SetSystemTime(CONST SYSTEMTIME *lpSystemTime)
301 LARGE_INTEGER NewSystemTime;
304 SystemTimeToFileTime (lpSystemTime, (PFILETIME)&NewSystemTime);
305 errCode = NtSetSystemTime (&NewSystemTime, &NewSystemTime);
306 if (!NT_SUCCESS(errCode))
316 GetTimeZoneInformation(LPTIME_ZONE_INFORMATION lpTimeZoneInformation)
318 TIME_ZONE_INFORMATION TimeZoneInformation;
321 DPRINT("GetTimeZoneInformation()\n");
323 Status = NtQuerySystemInformation(SystemCurrentTimeZoneInformation,
324 &TimeZoneInformation,
325 sizeof(TIME_ZONE_INFORMATION),
327 if (!NT_SUCCESS(Status))
329 SetLastErrorByStatus(Status);
330 return TIME_ZONE_ID_INVALID;
333 memcpy(lpTimeZoneInformation,
334 &TimeZoneInformation,
335 sizeof(TIME_ZONE_INFORMATION));
337 return(SharedUserData->TimeZoneId);
345 SetTimeZoneInformation(CONST TIME_ZONE_INFORMATION *lpTimeZoneInformation)
347 TIME_ZONE_INFORMATION TimeZoneInformation;
350 DPRINT("SetTimeZoneInformation()\n");
352 memcpy(&TimeZoneInformation,
353 lpTimeZoneInformation,
354 sizeof(TIME_ZONE_INFORMATION));
356 Status = RtlSetTimeZoneInformation(&TimeZoneInformation);
357 if (!NT_SUCCESS(Status))
359 SetLastErrorByStatus(Status);
363 NtSetSystemTime(0,0);
375 return GetTickCount();
385 return (DWORD)((ULONGLONG)SharedUserData->TickCountLow * SharedUserData->TickCountMultiplier / 16777216);
393 SystemTimeToTzSpecificLocalTime(
394 LPTIME_ZONE_INFORMATION lpTimeZoneInformation,
395 LPSYSTEMTIME lpUniversalTime,
396 LPSYSTEMTIME lpLocalTime
399 TIME_ZONE_INFORMATION TimeZoneInformation;
400 LPTIME_ZONE_INFORMATION lpTzInfo;
401 LARGE_INTEGER FileTime;
403 if (!lpTimeZoneInformation)
405 GetTimeZoneInformation (&TimeZoneInformation);
406 lpTzInfo = &TimeZoneInformation;
409 lpTzInfo = lpTimeZoneInformation;
411 if (!lpUniversalTime)
417 SystemTimeToFileTime (lpUniversalTime, (PFILETIME)&FileTime);
418 FileTime.QuadPart -= (lpTzInfo->Bias * TICKSPERMIN);
419 FileTimeToSystemTime ((PFILETIME)&FileTime, lpLocalTime);
429 GetSystemTimeAdjustment(PDWORD lpTimeAdjustment,
430 PDWORD lpTimeIncrement,
431 PWINBOOL lpTimeAdjustmentDisabled)
433 SYSTEM_QUERY_TIME_ADJUSTMENT Buffer;
436 Status = NtQuerySystemInformation(SystemTimeAdjustmentInformation,
438 sizeof(SYSTEM_QUERY_TIME_ADJUSTMENT),
440 if (!NT_SUCCESS(Status))
442 SetLastErrorByStatus(Status);
446 *lpTimeAdjustment = (DWORD)Buffer.TimeAdjustment;
447 *lpTimeIncrement = (DWORD)Buffer.MaximumIncrement;
448 *lpTimeAdjustmentDisabled = (WINBOOL)Buffer.TimeSynchronization;
458 SetSystemTimeAdjustment(DWORD dwTimeAdjustment,
459 WINBOOL bTimeAdjustmentDisabled)
462 SYSTEM_SET_TIME_ADJUSTMENT Buffer;
464 Buffer.TimeAdjustment = (ULONG)dwTimeAdjustment;
465 Buffer.TimeSynchronization = (BOOLEAN)bTimeAdjustmentDisabled;
467 Status = NtSetSystemInformation(SystemTimeAdjustmentInformation,
469 sizeof(SYSTEM_SET_TIME_ADJUSTMENT));
470 if (!NT_SUCCESS(Status))
472 SetLastErrorByStatus(Status);