如何制作任意的 Microsoft FILETIME?

如何制作任意的 Microsoft FILETIME?

我想制作一个任意的 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

相关内容