正确更改 Windows 上的文件时间戳?

Posted

技术标签:

【中文标题】正确更改 Windows 上的文件时间戳?【英文标题】:Changing file timestamps on windows correctly? 【发布时间】:2016-01-09 09:04:06 【问题描述】:

我正在尝试通过 Windows API 更改文件的文件创建时间,但我输入到函数中的日期最终会关闭一天左右,时间(小时和分钟)会关闭几个小时。

如何计算时区和夏令时等?或者更确切地说,如何在没有窗口调整时间的情况下设置我指定的确切日期时间

用到的代码如下:

    SYSTEMTIME sysTime;
    GetSystemTime(&sysTime);

    sysTime.wDay = d;
    sysTime.wMonth = m;
    sysTime.wYear = y;
    sysTime.wHour = h;
    sysTime.wMinute = min;
    sysTime.wSecond = s;
    sysTime.wMilliseconds = ms;

    FILETIME fTime;
    SystemTimeToFileTime(&sysTime,&fTime);

    SetFileTime(fHandle, &fTime, NULL, NULL);   // Create Time

比如我通过程序指定一个文件的时间为1/3/2015 21:57,在via之后查看文件的时间戳文件属性,时间显示为 ‎March ‎02, ‎2015, ‏‎10:57:12 AM

【问题讨论】:

【参考方案1】:

您的代码基本上是正确的。该应用程序通常使用 UTC 时间 (GetSystemTime),它只需要在向用户显示时间时进行本地时间转换。

如果您确实需要输入本地时间,请使用TzSpecificLocalTimeToSystemTime 将本地时间转换为UTC时间。

SYSTEMTIME local_time, system_time;
GetLocalTime(&local_time);

local_time.wHour = 2;//user input
...

TzSpecificLocalTimeToSystemTime(NULL, &local_time, &system_time);

FILETIME file_time;
SystemTimeToFileTime(&system_time, &file_time);
SetFileTime(h, &file_time, NULL, NULL);

否则只需使用SystemTimeToTzSpecificLocalTime 向用户显示数据/时间。

【讨论】:

以上是关于正确更改 Windows 上的文件时间戳?的主要内容,如果未能解决你的问题,请参考以下文章

使用 APFS 在 macOS 中更改符号链接的时间戳?

加入两个表后 Hive 时间戳值更改

防止 msdeploy 在 TFS 构建后同步未更改的文件?

比较应该是相同的 AAC 音频文件 - 时间戳?

如何复制文件但触摸新副本上的时间戳?

堆叠列不格式化 x 轴上的日期时间戳