Как сделать произвольный Microsoft FILETIME?
Я хотел бы сделать произвольный 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;
}
2 ответа
Вот ответ, который я нашел в моно исходном коде.
void _wapi_time_t_to_filetime (time_t timeval, WapiFileTime *filetime)
{
guint64 ticks;
ticks = ((guint64)timeval * 10000000) + 116444736000000000ULL;
filetime->dwLowDateTime = ticks & 0xFFFFFFFF;
filetime->dwHighDateTime = ticks >> 32;
}
Для файловой системы Windows есть как минимум 3 разных времени файла.
Самый простой способ сделать это - PowerShell, это предпочтительный способ при работе с Windows на уровне ОС, и он должен быть правильным для вопроса в области суперпользователя сети обмена стека.
$time = get-date -hour 0 -Minute 0 # this is today midnight
$file = "c:\yourfile.txt"
$file.CreationTime = $time
и если вам нравится:
$file.LastAccessTime = $time
$file.LastWriteTime = $time