【问题标题】:Changing file timestamps on windows correctly?正确更改 Windows 上的文件时间戳?
【发布时间】: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

【问题讨论】:

    标签: windows api timestamp


    【解决方案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 向用户显示数据/时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-23
      • 2010-09-23
      • 2011-08-06
      • 2015-06-14
      • 2011-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多