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 ******************************************************************/
15 #include <ddk/ntddk.h>
17 #include <kernel32/error.h>
21 #include <kernel32/kernel32.h>
23 /* TYPES *********************************************************************/
25 typedef struct __DOSTIME
32 typedef struct __DOSDATE
39 #define TICKSPERMIN 600000000
41 /* 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;
82 DosDateTimeToFileTime(
88 PDOSTIME pdtime = (PDOSTIME) &wFatTime;
89 PDOSDATE pddate = (PDOSDATE) &wFatDate;
90 SYSTEMTIME SystemTime;
92 if ( lpFileTime == NULL )
95 SystemTime.wMilliseconds = 0;
96 SystemTime.wSecond = pdtime->Second;
97 SystemTime.wMinute = pdtime->Minute;
98 SystemTime.wHour = pdtime->Hour;
100 SystemTime.wDay = pddate->Day;
101 SystemTime.wMonth = pddate->Month;
102 SystemTime.wYear = 1980 + pddate->Year;
104 SystemTimeToFileTime(&SystemTime,lpFileTime);
112 CONST FILETIME *lpFileTime1,
113 CONST FILETIME *lpFileTime2
116 if ( lpFileTime1 == NULL )
118 if ( lpFileTime2 == NULL )
121 if (*((PLONGLONG)lpFileTime1) > *((PLONGLONG)lpFileTime2))
123 else if (*((PLONGLONG)lpFileTime1) < *((PLONGLONG)lpFileTime2))
131 GetSystemTimeAsFileTime(PFILETIME lpFileTime)
133 NtQuerySystemTime ((TIME *)lpFileTime);
138 SystemTimeToFileTime(
139 CONST SYSTEMTIME * lpSystemTime,
140 LPFILETIME lpFileTime
144 TIME_FIELDS TimeFields;
145 LARGE_INTEGER liTime;
147 TimeFields.Year = lpSystemTime->wYear;
148 TimeFields.Month = lpSystemTime->wMonth;
149 TimeFields.Day = lpSystemTime->wDay;
150 TimeFields.Hour = lpSystemTime->wHour;
151 TimeFields.Minute = lpSystemTime->wMinute;
152 TimeFields.Second = lpSystemTime->wSecond;
153 TimeFields.Milliseconds = lpSystemTime->wMilliseconds;
155 if (RtlTimeFieldsToTime (&TimeFields, &liTime))
157 lpFileTime->dwLowDateTime = liTime.u.LowPart;
158 lpFileTime->dwHighDateTime = liTime.u.HighPart;
164 // dwDayOfWeek = RtlLargeIntegerDivide(FileTime,LIDAY,&dwRemDay);
165 // lpSystemTime->wDayOfWeek = 1 + GET_LARGE_INTEGER_LOW_PART(dwDayOfWeek) % 7;
171 FileTimeToSystemTime(
172 CONST FILETIME *lpFileTime,
173 LPSYSTEMTIME lpSystemTime
176 TIME_FIELDS TimeFields;
177 LARGE_INTEGER liTime;
179 liTime.u.LowPart = lpFileTime->dwLowDateTime;
180 liTime.u.HighPart = lpFileTime->dwHighDateTime;
182 if (liTime.u.HighPart >= 0x80000000)
187 RtlTimeToTimeFields(&liTime, &TimeFields);
189 lpSystemTime->wYear = TimeFields.Year;
190 lpSystemTime->wMonth = TimeFields.Month;
191 lpSystemTime->wDay = TimeFields.Day;
192 lpSystemTime->wHour = TimeFields.Hour;
193 lpSystemTime->wMinute = TimeFields.Minute;
194 lpSystemTime->wSecond = TimeFields.Second;
195 lpSystemTime->wMilliseconds = TimeFields.Milliseconds;
196 lpSystemTime->wDayOfWeek = TimeFields.Weekday;
204 FileTimeToLocalFileTime(
205 CONST FILETIME *lpFileTime,
206 LPFILETIME lpLocalFileTime
209 // FIXME: include time bias
210 *((PLONGLONG)lpLocalFileTime) = *((PLONGLONG)lpFileTime);
217 LocalFileTimeToFileTime(
218 CONST FILETIME *lpLocalFileTime,
219 LPFILETIME lpFileTime
222 // FIXME: include time bias
223 *((PLONGLONG)lpFileTime) = *((PLONGLONG)lpLocalFileTime);
230 GetLocalTime(LPSYSTEMTIME lpSystemTime)
233 FILETIME LocalFileTime;
235 NtQuerySystemTime ((TIME*)&FileTime);
236 FileTimeToLocalFileTime (&FileTime, &LocalFileTime);
237 FileTimeToSystemTime (&LocalFileTime, lpSystemTime);
242 GetSystemTime(LPSYSTEMTIME lpSystemTime)
246 NtQuerySystemTime ((TIME*)&FileTime);
247 FileTimeToSystemTime (&FileTime, lpSystemTime);
252 SetLocalTime(CONST SYSTEMTIME *lpSystemTime)
254 FILETIME LocalFileTime;
255 LARGE_INTEGER FileTime;
258 SystemTimeToFileTime (lpSystemTime, &LocalFileTime);
259 LocalFileTimeToFileTime (&LocalFileTime, (FILETIME *)&FileTime);
260 errCode = NtSetSystemTime (&FileTime, &FileTime);
261 if (!NT_SUCCESS(errCode))
268 SetSystemTime(CONST SYSTEMTIME *lpSystemTime)
270 LARGE_INTEGER NewSystemTime;
273 SystemTimeToFileTime (lpSystemTime, (PFILETIME)&NewSystemTime);
274 errCode = NtSetSystemTime (&NewSystemTime, &NewSystemTime);
275 if (!NT_SUCCESS(errCode))
282 GetTimeZoneInformation(LPTIME_ZONE_INFORMATION lpTimeZoneInformation)
284 TIME_ZONE_INFORMATION TimeZoneInformation;
287 DPRINT("GetTimeZoneInformation()\n");
289 Status = NtQuerySystemInformation(SystemCurrentTimeZoneInformation,
290 &TimeZoneInformation,
291 sizeof(TIME_ZONE_INFORMATION),
293 if (!NT_SUCCESS(Status))
295 SetLastErrorByStatus(Status);
296 return TIME_ZONE_ID_INVALID;
299 memcpy(lpTimeZoneInformation,
300 &TimeZoneInformation,
301 sizeof(TIME_ZONE_INFORMATION));
303 return(SharedUserData->TimeZoneId);
308 SetTimeZoneInformation(CONST TIME_ZONE_INFORMATION *lpTimeZoneInformation)
310 TIME_ZONE_INFORMATION TimeZoneInformation;
313 DPRINT("SetTimeZoneInformation()\n");
315 memcpy(&TimeZoneInformation,
316 lpTimeZoneInformation,
317 sizeof(TIME_ZONE_INFORMATION));
319 Status = RtlSetTimeZoneInformation(&TimeZoneInformation);
320 if (!NT_SUCCESS(Status))
322 SetLastErrorByStatus(Status);
326 NtSetSystemTime(0,0);
335 return GetTickCount();
343 NtGetTickCount(&UpTime);
349 SystemTimeToTzSpecificLocalTime(
350 LPTIME_ZONE_INFORMATION lpTimeZoneInformation,
351 LPSYSTEMTIME lpUniversalTime,
352 LPSYSTEMTIME lpLocalTime
355 TIME_ZONE_INFORMATION TimeZoneInformation;
356 LPTIME_ZONE_INFORMATION lpTzInfo;
357 LARGE_INTEGER FileTime;
359 if (!lpTimeZoneInformation)
361 GetTimeZoneInformation (&TimeZoneInformation);
362 lpTzInfo = &TimeZoneInformation;
365 lpTzInfo = lpTimeZoneInformation;
367 if (!lpUniversalTime)
373 SystemTimeToFileTime (lpUniversalTime, (PFILETIME)&FileTime);
374 FileTime.QuadPart -= (lpTzInfo->Bias * TICKSPERMIN);
375 FileTimeToSystemTime ((PFILETIME)&FileTime, lpLocalTime);
382 GetSystemTimeAdjustment(PDWORD lpTimeAdjustment,
383 PDWORD lpTimeIncrement,
384 PWINBOOL lpTimeAdjustmentDisabled)
386 SYSTEM_QUERY_TIME_ADJUSTMENT Buffer;
389 Status = NtQuerySystemInformation(SystemTimeAdjustmentInformation,
391 sizeof(SYSTEM_QUERY_TIME_ADJUSTMENT),
393 if (!NT_SUCCESS(Status))
395 SetLastErrorByStatus(Status);
399 *lpTimeAdjustment = (DWORD)Buffer.TimeAdjustment;
400 *lpTimeIncrement = (DWORD)Buffer.MaximumIncrement;
401 *lpTimeAdjustmentDisabled = (WINBOOL)Buffer.TimeSynchronization;
408 SetSystemTimeAdjustment(DWORD dwTimeAdjustment,
409 WINBOOL bTimeAdjustmentDisabled)
412 SYSTEM_TIME_ADJUSTMENT_INFO Buffer;
414 Buffer.TimeAdjustment = (ULONG)dwTimeAdjustment;
415 Buffer.TimeSynchronization = (BOOLEAN)bTimeAdjustmentDisabled;
417 Status = NtSetSystemInformation(SystemTimeAdjustmentInformation,
419 sizeof(SYSTEM_TIME_ADJUSTMENT_INFO));
420 if (!NT_SUCCESS(Status))
422 SetLastErrorByStatus(Status);