1 // Windows/Time.h
2 
3 #ifndef __WINDOWS_TIME_H
4 #define __WINDOWS_TIME_H
5 
6 #include "Common/Types.h"
7 #include "Windows/Defs.h"
8 
9 namespace NWindows {
10 namespace NTime {
11 
DosTimeToFileTime(UInt32 dosTime,FILETIME & fileTime)12 inline bool DosTimeToFileTime(UInt32 dosTime, FILETIME &fileTime)
13 {
14   return BOOLToBool(::DosDateTimeToFileTime(UInt16(dosTime >> 16),
15       UInt16(dosTime & 0xFFFF), &fileTime));
16 }
17 
18 const UInt32 kHighDosTime = 0xFF9FBF7D;
19 const UInt32 kLowDosTime = 0x210000;
20 
FileTimeToDosTime(const FILETIME & fileTime,UInt32 & dosTime)21 inline bool FileTimeToDosTime(const FILETIME &fileTime, UInt32 &dosTime)
22 {
23   WORD datePart, timePart;
24   if (!::FileTimeToDosDateTime(&fileTime, &datePart, &timePart))
25   {
26     if (fileTime.dwHighDateTime >= 0x01C00000) // 2000
27       dosTime = kHighDosTime;
28     else
29       dosTime = kLowDosTime;
30     return false;
31   }
32   dosTime = (((UInt32)datePart) << 16) + timePart;
33   return true;
34 }
35 
36 const UInt32 kNumTimeQuantumsInSecond = 10000000;
37 const UInt64 kUnixTimeStartValue = ((UInt64)kNumTimeQuantumsInSecond) * 60 * 60 * 24 * 134774;
38 
UnixTimeToFileTime(UInt32 unixTime,FILETIME & fileTime)39 inline void UnixTimeToFileTime(UInt32 unixTime, FILETIME &fileTime)
40 {
41   UInt64 v = kUnixTimeStartValue + ((UInt64)unixTime) * kNumTimeQuantumsInSecond;
42   fileTime.dwLowDateTime = (DWORD)v;
43   fileTime.dwHighDateTime = (DWORD)(v >> 32);
44 }
45 
FileTimeToUnixTime(const FILETIME & fileTime,UInt32 & unixTime)46 inline bool FileTimeToUnixTime(const FILETIME &fileTime, UInt32 &unixTime)
47 {
48   UInt64 winTime = (((UInt64)fileTime.dwHighDateTime) << 32) + fileTime.dwLowDateTime;
49   if (winTime < kUnixTimeStartValue)
50   {
51     unixTime = 0;
52     return false;
53   }
54   winTime = (winTime - kUnixTimeStartValue) / kNumTimeQuantumsInSecond;
55   if (winTime > 0xFFFFFFFF)
56   {
57     unixTime = 0xFFFFFFFF;
58     return false;
59   }
60   unixTime = (UInt32)winTime;
61   return true;
62 }
63 
64 }}
65 
66 #endif
67