![如何制作任意的 Microsoft FILETIME?](https://linux22.com/image/1495394/%E5%A6%82%E4%BD%95%E5%88%B6%E4%BD%9C%E4%BB%BB%E6%84%8F%E7%9A%84%20Microsoft%20FILETIME%EF%BC%9F.png)
我想制作一个任意的 Microsoft FILETIME。算法比 Microsoft 编程语言更重要。
例如,如果今天是 2016 年 6 月 2 日,我想计算 2016 年 6 月午夜的 FILETIME。
任何帮助是极大的赞赏。
[编辑于 2016 年 6 月 2 日下午 5: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;
}
答案1
这是我在 Mono 源代码中找到的答案。
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;
}
答案2
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