| // Windows/Time.cpp |
| |
| #include "StdAfx.h" |
| |
| #include "Time.h" |
| #include "Windows/Defs.h" |
| |
| namespace NWindows { |
| namespace NTime { |
| |
| static const UInt32 kFileTimeStartYear = 1601; |
| |
| bool DosTimeToFileTime(UInt32 dosTime, FILETIME &fileTime) |
| { |
| return BOOLToBool(::DosDateTimeToFileTime((UInt16)(dosTime >> 16), (UInt16)(dosTime & 0xFFFF), &fileTime)); |
| } |
| |
| static const UInt32 kHighDosTime = 0xFF9FBF7D; |
| static const UInt32 kLowDosTime = 0x210000; |
| |
| bool FileTimeToDosTime(const FILETIME &fileTime, UInt32 &dosTime) |
| { |
| WORD datePart, timePart; |
| if (!::FileTimeToDosDateTime(&fileTime, &datePart, &timePart)) |
| { |
| dosTime = (fileTime.dwHighDateTime >= 0x01C00000) ? kHighDosTime : kLowDosTime; |
| return false; |
| } |
| dosTime = (((UInt32)datePart) << 16) + timePart; |
| return true; |
| } |
| |
| static const UInt32 kNumTimeQuantumsInSecond = 10000000; |
| static const UInt64 kUnixTimeStartValue = ((UInt64)kNumTimeQuantumsInSecond) * 60 * 60 * 24 * 134774; |
| |
| void UnixTimeToFileTime(UInt32 unixTime, FILETIME &fileTime) |
| { |
| UInt64 v = kUnixTimeStartValue + ((UInt64)unixTime) * kNumTimeQuantumsInSecond; |
| fileTime.dwLowDateTime = (DWORD)v; |
| fileTime.dwHighDateTime = (DWORD)(v >> 32); |
| } |
| |
| bool FileTimeToUnixTime(const FILETIME &fileTime, UInt32 &unixTime) |
| { |
| UInt64 winTime = (((UInt64)fileTime.dwHighDateTime) << 32) + fileTime.dwLowDateTime; |
| if (winTime < kUnixTimeStartValue) |
| { |
| unixTime = 0; |
| return false; |
| } |
| winTime = (winTime - kUnixTimeStartValue) / kNumTimeQuantumsInSecond; |
| if (winTime > 0xFFFFFFFF) |
| { |
| unixTime = 0xFFFFFFFF; |
| return false; |
| } |
| unixTime = (UInt32)winTime; |
| return true; |
| } |
| |
| bool GetSecondsSince1601(unsigned year, unsigned month, unsigned day, |
| unsigned hour, unsigned min, unsigned sec, UInt64 &resSeconds) |
| { |
| resSeconds = 0; |
| if (year < kFileTimeStartYear || year >= 10000 || month < 1 || month > 12 || |
| day < 1 || day > 31 || hour > 23 || min > 59 || sec > 59) |
| return false; |
| UInt32 numYears = year - kFileTimeStartYear; |
| UInt32 numDays = numYears * 365 + numYears / 4 - numYears / 100 + numYears / 400; |
| Byte ms[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; |
| if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) |
| ms[1] = 29; |
| month--; |
| for (unsigned i = 0; i < month; i++) |
| numDays += ms[i]; |
| numDays += day - 1; |
| resSeconds = ((UInt64)(numDays * 24 + hour) * 60 + min) * 60 + sec; |
| return true; |
| } |
| |
| void GetCurUtcFileTime(FILETIME &ft) |
| { |
| SYSTEMTIME st; |
| GetSystemTime(&st); |
| SystemTimeToFileTime(&st, &ft); |
| } |
| |
| }} |