Я хотел бы сделать произвольный Microsoft FILETIME. Алгоритм является более важным, чем язык программирования Microsoft.
Например, если сегодня 2 июня 2016 года, я хотел бы рассчитать FILETIME в полночь июня 2016 года.
Любая помощь с благодарностью.
[РЕДАКТИРОВАТЬ 2 июня 2016 17:09 вечера Вот программа, которая вызывает у меня головные боли:
Microsoft SYSTEMTIME в наносекундах составляет 1467432000. Microsoft FILETIME в наносекундах для той же отметки даты и времени - 1470186549.
Вот мой алгоритм. Могу я спросить, что я сделал не так?]
void _wapi_time_t_to_filetime(time_t timeval, FILETIME* filetime)
{
int64_t ticks;
ticks = ((int64_t)timeval * 10000000) + 116444736000000000ULL;
filetime->dwLowDateTime = ticks & 0xFFFFFFFF;
filetime->dwHighDateTime = ticks >> 32;
}
int64_t FileTime_to_POSIX(FILETIME ft)
{
FILETIME localFileTime;
FileTimeToLocalFileTime(&ft, &localFileTime);
SYSTEMTIME sysTime;
FileTimeToSystemTime(&localFileTime, &sysTime);
struct tm tmtime = { 0 };
tmtime.tm_year = sysTime.wYear - 1900;
tmtime.tm_mon = sysTime.wMonth; // -1;
tmtime.tm_mday = sysTime.wDay;
tmtime.tm_hour = sysTime.wHour;
tmtime.tm_min = sysTime.wMinute;
tmtime.tm_sec = sysTime.wSecond;
tmtime.tm_wday = 0;
tmtime.tm_yday = 0;
tmtime.tm_isdst = -1;
time_t ret = mktime(&tmtime);
return ret;
}
int _tmain(int argc, _TCHAR* argv[])
{
SYSTEMTIME stUTCStart, stUTCFinish;
FILETIME ftStart, ftFinish;
int64_t elapsedNanoSeconds(0);
GetSystemTime(&stUTCStart);
printf("%d nanoseconds\n", ConvertSYSTEMTIMEToNanoseconds(stUTCStart));
struct tm tmtime = { 0 };
tmtime.tm_year = 2016 - 1900;
tmtime.tm_mon = 6;
tmtime.tm_mday = 2;
tmtime.tm_hour = stUTCStart.wHour;
tmtime.tm_min = stUTCStart.wSecond;
tmtime.tm_sec = stUTCStart.wSecond;
tmtime.tm_wday = stUTCStart.wDayOfWeek;
tmtime.tm_yday = 132;
tmtime.tm_isdst = -1;
time_t ret = mktime(&tmtime);
_wapi_time_t_to_filetime(ret, &ftStart);
printf("%d nanoseconds\n", FileTime_to_POSIX(ftStart));
return 0;
}