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 Dekker ( ariadne@xs4all.nl)
8 * DOSDATE and DOSTIME structures from Onno Hovers
13 /* INCLUDES ******************************************************************/
18 #include "../include/debug.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
= { 0 };
55 if ( lpFileTime
== NULL
)
58 if ( lpFatDate
== NULL
)
61 if ( lpFatTime
== NULL
)
69 pdtime
->Second
= SystemTime
.wSecond
/ 2;
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
* 2;
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
)
146 lpFileTime
->dwHighDateTime
= SharedUserData
->SystemTime
.High1Time
;
147 lpFileTime
->dwLowDateTime
= SharedUserData
->SystemTime
.LowPart
;
149 while (lpFileTime
->dwHighDateTime
!= (DWORD
)SharedUserData
->SystemTime
.High2Time
);
158 SystemTimeToFileTime(
159 CONST SYSTEMTIME
* lpSystemTime
,
160 LPFILETIME lpFileTime
164 TIME_FIELDS TimeFields
;
165 LARGE_INTEGER liTime
;
167 TimeFields
.Year
= lpSystemTime
->wYear
;
168 TimeFields
.Month
= lpSystemTime
->wMonth
;
169 TimeFields
.Day
= lpSystemTime
->wDay
;
170 TimeFields
.Hour
= lpSystemTime
->wHour
;
171 TimeFields
.Minute
= lpSystemTime
->wMinute
;
172 TimeFields
.Second
= lpSystemTime
->wSecond
;
173 TimeFields
.Milliseconds
= lpSystemTime
->wMilliseconds
;
175 if (RtlTimeFieldsToTime (&TimeFields
, &liTime
))
177 lpFileTime
->dwLowDateTime
= liTime
.u
.LowPart
;
178 lpFileTime
->dwHighDateTime
= liTime
.u
.HighPart
;
190 FileTimeToSystemTime(
191 CONST FILETIME
*lpFileTime
,
192 LPSYSTEMTIME lpSystemTime
195 TIME_FIELDS TimeFields
;
196 LARGE_INTEGER liTime
;
198 if(lpFileTime
->dwHighDateTime
& 0x80000000)
201 liTime
.u
.LowPart
= lpFileTime
->dwLowDateTime
;
202 liTime
.u
.HighPart
= lpFileTime
->dwHighDateTime
;
204 RtlTimeToTimeFields(&liTime
, &TimeFields
);
206 lpSystemTime
->wYear
= TimeFields
.Year
;
207 lpSystemTime
->wMonth
= TimeFields
.Month
;
208 lpSystemTime
->wDay
= TimeFields
.Day
;
209 lpSystemTime
->wHour
= TimeFields
.Hour
;
210 lpSystemTime
->wMinute
= TimeFields
.Minute
;
211 lpSystemTime
->wSecond
= TimeFields
.Second
;
212 lpSystemTime
->wMilliseconds
= TimeFields
.Milliseconds
;
213 lpSystemTime
->wDayOfWeek
= TimeFields
.Weekday
;
224 FileTimeToLocalFileTime(
225 CONST FILETIME
*lpFileTime
,
226 LPFILETIME lpLocalFileTime
229 LARGE_INTEGER TimeZoneBias
;
233 TimeZoneBias
.HighPart
= SharedUserData
->TimeZoneBias
.High1Time
;
234 TimeZoneBias
.LowPart
= SharedUserData
->TimeZoneBias
.LowPart
;
236 while (TimeZoneBias
.HighPart
!= SharedUserData
->TimeZoneBias
.High2Time
);
238 *((PLONGLONG
)lpLocalFileTime
) =
239 *((PLONGLONG
)lpFileTime
) - TimeZoneBias
.QuadPart
;
250 LocalFileTimeToFileTime(
251 CONST FILETIME
*lpLocalFileTime
,
252 LPFILETIME lpFileTime
255 LARGE_INTEGER TimeZoneBias
;
259 TimeZoneBias
.HighPart
= SharedUserData
->TimeZoneBias
.High1Time
;
260 TimeZoneBias
.LowPart
= SharedUserData
->TimeZoneBias
.LowPart
;
262 while (TimeZoneBias
.HighPart
!= SharedUserData
->TimeZoneBias
.High2Time
);
264 *((PLONGLONG
)lpFileTime
) =
265 *((PLONGLONG
)lpLocalFileTime
) + TimeZoneBias
.QuadPart
;
275 GetLocalTime(LPSYSTEMTIME lpSystemTime
)
278 FILETIME LocalFileTime
;
280 GetSystemTimeAsFileTime(&FileTime
);
281 FileTimeToLocalFileTime(&FileTime
, &LocalFileTime
);
282 FileTimeToSystemTime(&LocalFileTime
, lpSystemTime
);
290 GetSystemTime(LPSYSTEMTIME lpSystemTime
)
294 GetSystemTimeAsFileTime(&FileTime
);
295 FileTimeToSystemTime(&FileTime
, lpSystemTime
);
303 SetLocalTime(CONST SYSTEMTIME
*lpSystemTime
)
305 FILETIME LocalFileTime
;
306 LARGE_INTEGER FileTime
;
309 SystemTimeToFileTime(lpSystemTime
, &LocalFileTime
);
310 LocalFileTimeToFileTime(&LocalFileTime
, (FILETIME
*)&FileTime
);
311 Status
= NtSetSystemTime(&FileTime
, &FileTime
);
312 if (!NT_SUCCESS(Status
))
322 SetSystemTime(CONST SYSTEMTIME
*lpSystemTime
)
324 LARGE_INTEGER NewSystemTime
;
327 SystemTimeToFileTime(lpSystemTime
, (PFILETIME
)&NewSystemTime
);
328 Status
= NtSetSystemTime(&NewSystemTime
, &NewSystemTime
);
329 if (!NT_SUCCESS(Status
))
339 GetTimeZoneInformation(LPTIME_ZONE_INFORMATION lpTimeZoneInformation
)
343 DPRINT("GetTimeZoneInformation()\n");
345 Status
= NtQuerySystemInformation(SystemCurrentTimeZoneInformation
,
346 lpTimeZoneInformation
,
347 sizeof(TIME_ZONE_INFORMATION
),
349 if (!NT_SUCCESS(Status
))
351 SetLastErrorByStatus(Status
);
352 return TIME_ZONE_ID_INVALID
;
355 return(SharedUserData
->TimeZoneId
);
363 SetTimeZoneInformation(CONST TIME_ZONE_INFORMATION
*lpTimeZoneInformation
)
367 DPRINT("SetTimeZoneInformation()\n");
369 Status
= RtlSetTimeZoneInformation((LPTIME_ZONE_INFORMATION
)lpTimeZoneInformation
);
370 if (!NT_SUCCESS(Status
))
372 DPRINT1("RtlSetTimeZoneInformation() failed (Status %lx)\n", Status
);
373 SetLastErrorByStatus(Status
);
377 Status
= NtSetSystemInformation(SystemCurrentTimeZoneInformation
,
378 (PVOID
)lpTimeZoneInformation
,
379 sizeof(TIME_ZONE_INFORMATION
));
380 if (!NT_SUCCESS(Status
))
382 DPRINT1("NtSetSystemInformation() failed (Status %lx)\n", Status
);
383 SetLastErrorByStatus(Status
);
397 return (DWORD
)((ULONGLONG
)SharedUserData
->TickCountLowDeprecated
* SharedUserData
->TickCountMultiplier
/ 16777216);
405 SystemTimeToTzSpecificLocalTime(
406 LPTIME_ZONE_INFORMATION lpTimeZoneInformation
,
407 LPSYSTEMTIME lpUniversalTime
,
408 LPSYSTEMTIME lpLocalTime
411 TIME_ZONE_INFORMATION TimeZoneInformation
;
412 LPTIME_ZONE_INFORMATION lpTzInfo
;
413 LARGE_INTEGER FileTime
;
415 if (!lpTimeZoneInformation
)
417 GetTimeZoneInformation(&TimeZoneInformation
);
418 lpTzInfo
= &TimeZoneInformation
;
421 lpTzInfo
= lpTimeZoneInformation
;
423 if (!lpUniversalTime
)
429 SystemTimeToFileTime(lpUniversalTime
, (PFILETIME
)&FileTime
);
430 FileTime
.QuadPart
-= (lpTzInfo
->Bias
* TICKSPERMIN
);
431 FileTimeToSystemTime((PFILETIME
)&FileTime
, lpLocalTime
);
441 GetSystemTimeAdjustment(PDWORD lpTimeAdjustment
,
442 PDWORD lpTimeIncrement
,
443 PBOOL lpTimeAdjustmentDisabled
)
445 SYSTEM_QUERY_TIME_ADJUST_INFORMATION Buffer
;
448 Status
= NtQuerySystemInformation(SystemTimeAdjustmentInformation
,
450 sizeof(SYSTEM_QUERY_TIME_ADJUST_INFORMATION
),
452 if (!NT_SUCCESS(Status
))
454 SetLastErrorByStatus(Status
);
458 *lpTimeAdjustment
= (DWORD
)Buffer
.TimeAdjustment
;
459 *lpTimeIncrement
= (DWORD
)Buffer
.TimeIncrement
;
460 *lpTimeAdjustmentDisabled
= (BOOL
)Buffer
.Enable
;
470 SetSystemTimeAdjustment(DWORD dwTimeAdjustment
,
471 BOOL bTimeAdjustmentDisabled
)
474 SYSTEM_SET_TIME_ADJUST_INFORMATION Buffer
;
476 Buffer
.TimeAdjustment
= (ULONG
)dwTimeAdjustment
;
477 Buffer
.Enable
= (BOOLEAN
)bTimeAdjustmentDisabled
;
479 Status
= NtSetSystemInformation(SystemTimeAdjustmentInformation
,
481 sizeof(SYSTEM_SET_TIME_ADJUST_INFORMATION
));
482 if (!NT_SUCCESS(Status
))
484 SetLastErrorByStatus(Status
);
498 LPFILETIME lpIdleTime
,
499 LPFILETIME lpKernelTime
,
500 LPFILETIME lpUserTime
503 SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION SysProcPerfInfo
;
506 Status
= ZwQuerySystemInformation(SystemProcessorPerformanceInformation
,
508 sizeof(SysProcPerfInfo
),
511 if (!NT_SUCCESS(Status
))
513 SetLastErrorByStatus(Status
);
517 Good only for one processor system.
520 lpIdleTime
->dwLowDateTime
= SysProcPerfInfo
.IdleTime
.LowPart
;
521 lpIdleTime
->dwHighDateTime
= SysProcPerfInfo
.IdleTime
.HighPart
;
523 lpKernelTime
->dwLowDateTime
= SysProcPerfInfo
.KernelTime
.LowPart
;
524 lpKernelTime
->dwHighDateTime
= SysProcPerfInfo
.KernelTime
.HighPart
;
526 lpUserTime
->dwLowDateTime
= SysProcPerfInfo
.UserTime
.LowPart
;
527 lpUserTime
->dwHighDateTime
= SysProcPerfInfo
.UserTime
.HighPart
;