【发布时间】:2020-04-29 03:29:00
【问题描述】:
我正在尝试将文件的创建日期修改为发布日期。我首先将诸如“2 April 2005”之类的字符串转换为std::tm。然后我创建一个SYSTEMTIME 如下:
std::tm dt = from_string("2 April 2005");
SYSTEMTIME st { 0 };
st.wYear = dt.tm_year + 1900; // dt is years from 1900
st.wMonth = dt.tm_mon + 1; // dt is month index 0
st.wDay = dt.tm_mday;
st.wHour = 6; // FILETIME is based on UTC, which is 6 hours ahead
之后,我将 SYSTEMTIME 转换为 FILETIME 并使用它来应用更改。
这会将文件时间设置为2 April 2005 12:00:00 AM,这是正确的。但是,4 月 2 日之后的视频被设置为 1:00:00 AM,果然,夏令时发生在 2005 年 4 月 3 日。
如何确定某个日期是在夏令时之前还是之后,以便我可以相应地调整st.wHour?目标是将所有时间设置为12:00:00 AM。最好这适用于可追溯到 60 年代和当前的日期。
我尝试使用TIME_ZONE_INFORMATION 和GetTimeZoneInformation,但我只返回TIME_ZONE_ID_STANDARD。
【问题讨论】:
-
您使用什么函数将
SYSTEMTIME转换为FILETIME?我正在阅读的文档说SYSTEMTIME可以表示 UTC 或本地时间,具体取决于被调用的函数。 -
我正在使用
SystemTimeToFileTime。 -
文档说
SystemTimeToFileTime假定SYSTEMTIME已经在UTC。因此我不明白st.wHour = 6是如何映射到午夜 UTC 的。 -
那么问题可能出在下游?我正在使用
SetFileTime并传递FILETIME{3921264640, 29701910},这会在我的机器上提前 6 小时产生。 -
我认为操作系统会在 2007 年之前和之后向您显示本地时间。而且我也怀疑它将使用 2007 年(及以后)时区规则进行预2007 年的日期,但我在这方面可能是错误的。如果我是对的,那么 2007 年之前 3 月的第 2 个星期日和 4 月的第一个星期日之间的日期可能会延迟 1 点。