1 /* $Id: time.c,v 1.22 2003/07/10 18:50:51 chorns Exp $
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
))
143 GetSystemTimeAsFileTime(PFILETIME lpFileTime
)
145 NtQuerySystemTime ((TIME
*)lpFileTime
);
154 SystemTimeToFileTime(
155 CONST SYSTEMTIME
* lpSystemTime
,
156 LPFILETIME lpFileTime
160 TIME_FIELDS TimeFields
;
161 LARGE_INTEGER liTime
;
163 TimeFields
.Year
= lpSystemTime
->wYear
;
164 TimeFields
.Month
= lpSystemTime
->wMonth
;
165 TimeFields
.Day
= lpSystemTime
->wDay
;
166 TimeFields
.Hour
= lpSystemTime
->wHour
;
167 TimeFields
.Minute
= lpSystemTime
->wMinute
;
168 TimeFields
.Second
= lpSystemTime
->wSecond
;
169 TimeFields
.Milliseconds
= lpSystemTime
->wMilliseconds
;
171 if (RtlTimeFieldsToTime (&TimeFields
, &liTime
))
173 lpFileTime
->dwLowDateTime
= liTime
.u
.LowPart
;
174 lpFileTime
->dwHighDateTime
= liTime
.u
.HighPart
;
186 FileTimeToSystemTime(
187 CONST FILETIME
*lpFileTime
,
188 LPSYSTEMTIME lpSystemTime
191 TIME_FIELDS TimeFields
;
192 LARGE_INTEGER liTime
;
194 if(lpFileTime
->dwHighDateTime
& 0x80000000)
197 liTime
.u
.LowPart
= lpFileTime
->dwLowDateTime
;
198 liTime
.u
.HighPart
= lpFileTime
->dwHighDateTime
;
200 RtlTimeToTimeFields(&liTime
, &TimeFields
);
202 lpSystemTime
->wYear
= TimeFields
.Year
;
203 lpSystemTime
->wMonth
= TimeFields
.Month
;
204 lpSystemTime
->wDay
= TimeFields
.Day
;
205 lpSystemTime
->wHour
= TimeFields
.Hour
;
206 lpSystemTime
->wMinute
= TimeFields
.Minute
;
207 lpSystemTime
->wSecond
= TimeFields
.Second
;
208 lpSystemTime
->wMilliseconds
= TimeFields
.Milliseconds
;
209 lpSystemTime
->wDayOfWeek
= TimeFields
.Weekday
;
220 FileTimeToLocalFileTime(
221 CONST FILETIME
*lpFileTime
,
222 LPFILETIME lpLocalFileTime
225 // FIXME: include time bias
226 *((PLONGLONG
)lpLocalFileTime
) = *((PLONGLONG
)lpFileTime
);
237 LocalFileTimeToFileTime(
238 CONST FILETIME
*lpLocalFileTime
,
239 LPFILETIME lpFileTime
242 // FIXME: include time bias
243 *((PLONGLONG
)lpFileTime
) = *((PLONGLONG
)lpLocalFileTime
);
253 GetLocalTime(LPSYSTEMTIME lpSystemTime
)
256 FILETIME LocalFileTime
;
258 NtQuerySystemTime ((TIME
*)&FileTime
);
259 FileTimeToLocalFileTime (&FileTime
, &LocalFileTime
);
260 FileTimeToSystemTime (&LocalFileTime
, lpSystemTime
);
268 GetSystemTime(LPSYSTEMTIME lpSystemTime
)
272 NtQuerySystemTime ((TIME
*)&FileTime
);
273 FileTimeToSystemTime (&FileTime
, lpSystemTime
);
281 SetLocalTime(CONST SYSTEMTIME
*lpSystemTime
)
283 FILETIME LocalFileTime
;
284 LARGE_INTEGER FileTime
;
287 SystemTimeToFileTime (lpSystemTime
, &LocalFileTime
);
288 LocalFileTimeToFileTime (&LocalFileTime
, (FILETIME
*)&FileTime
);
289 errCode
= NtSetSystemTime (&FileTime
, &FileTime
);
290 if (!NT_SUCCESS(errCode
))
300 SetSystemTime(CONST SYSTEMTIME
*lpSystemTime
)
302 LARGE_INTEGER NewSystemTime
;
305 SystemTimeToFileTime (lpSystemTime
, (PFILETIME
)&NewSystemTime
);
306 errCode
= NtSetSystemTime (&NewSystemTime
, &NewSystemTime
);
307 if (!NT_SUCCESS(errCode
))
317 GetTimeZoneInformation(LPTIME_ZONE_INFORMATION lpTimeZoneInformation
)
319 TIME_ZONE_INFORMATION TimeZoneInformation
;
322 DPRINT("GetTimeZoneInformation()\n");
324 Status
= NtQuerySystemInformation(SystemCurrentTimeZoneInformation
,
325 &TimeZoneInformation
,
326 sizeof(TIME_ZONE_INFORMATION
),
328 if (!NT_SUCCESS(Status
))
330 SetLastErrorByStatus(Status
);
331 return TIME_ZONE_ID_INVALID
;
334 memcpy(lpTimeZoneInformation
,
335 &TimeZoneInformation
,
336 sizeof(TIME_ZONE_INFORMATION
));
338 return(SharedUserData
->TimeZoneId
);
346 SetTimeZoneInformation(CONST TIME_ZONE_INFORMATION
*lpTimeZoneInformation
)
348 TIME_ZONE_INFORMATION TimeZoneInformation
;
351 DPRINT("SetTimeZoneInformation()\n");
353 memcpy(&TimeZoneInformation
,
354 lpTimeZoneInformation
,
355 sizeof(TIME_ZONE_INFORMATION
));
357 Status
= RtlSetTimeZoneInformation(&TimeZoneInformation
);
358 if (!NT_SUCCESS(Status
))
360 SetLastErrorByStatus(Status
);
364 NtSetSystemTime(0,0);
376 return GetTickCount();
386 return (DWORD
)((ULONGLONG
)SharedUserData
->TickCountLow
* SharedUserData
->TickCountMultiplier
/ 16777216);
394 SystemTimeToTzSpecificLocalTime(
395 LPTIME_ZONE_INFORMATION lpTimeZoneInformation
,
396 LPSYSTEMTIME lpUniversalTime
,
397 LPSYSTEMTIME lpLocalTime
400 TIME_ZONE_INFORMATION TimeZoneInformation
;
401 LPTIME_ZONE_INFORMATION lpTzInfo
;
402 LARGE_INTEGER FileTime
;
404 if (!lpTimeZoneInformation
)
406 GetTimeZoneInformation (&TimeZoneInformation
);
407 lpTzInfo
= &TimeZoneInformation
;
410 lpTzInfo
= lpTimeZoneInformation
;
412 if (!lpUniversalTime
)
418 SystemTimeToFileTime (lpUniversalTime
, (PFILETIME
)&FileTime
);
419 FileTime
.QuadPart
-= (lpTzInfo
->Bias
* TICKSPERMIN
);
420 FileTimeToSystemTime ((PFILETIME
)&FileTime
, lpLocalTime
);
430 GetSystemTimeAdjustment(PDWORD lpTimeAdjustment
,
431 PDWORD lpTimeIncrement
,
432 PWINBOOL lpTimeAdjustmentDisabled
)
434 SYSTEM_QUERY_TIME_ADJUSTMENT Buffer
;
437 Status
= NtQuerySystemInformation(SystemTimeAdjustmentInformation
,
439 sizeof(SYSTEM_QUERY_TIME_ADJUSTMENT
),
441 if (!NT_SUCCESS(Status
))
443 SetLastErrorByStatus(Status
);
447 *lpTimeAdjustment
= (DWORD
)Buffer
.TimeAdjustment
;
448 *lpTimeIncrement
= (DWORD
)Buffer
.MaximumIncrement
;
449 *lpTimeAdjustmentDisabled
= (WINBOOL
)Buffer
.TimeSynchronization
;
459 SetSystemTimeAdjustment(DWORD dwTimeAdjustment
,
460 WINBOOL bTimeAdjustmentDisabled
)
463 SYSTEM_TIME_ADJUSTMENT_INFO Buffer
;
465 Buffer
.TimeAdjustment
= (ULONG
)dwTimeAdjustment
;
466 Buffer
.TimeSynchronization
= (BOOLEAN
)bTimeAdjustmentDisabled
;
468 Status
= NtSetSystemInformation(SystemTimeAdjustmentInformation
,
470 sizeof(SYSTEM_TIME_ADJUSTMENT_INFO
));
471 if (!NT_SUCCESS(Status
))
473 SetLastErrorByStatus(Status
);