如何解决文件时间到/从 ISO 8601 与 Win32 API正确使用夏令时?
用.NET写一些东西;它运作良好。现在我正在尝试使用 Win32 API 将其重写为 shell 扩展。最终,我想将 FILETIME
与 ISO-8601 字符串相互转换。这是可行的,不用大惊小怪,使用 GetTimeZoneinformation
和 FileTimetoSystemTime
以及 SystemTimetoTzSpecificLocalTime
和 StringCchPrintf
将 SYstemTIME
和 TIME_ZONE_informatION
结构的成员组装成一个字符串。
与处理日期/时间时一样,问题是夏令时。使用 GetTimeZoneinformation
告诉我 现在 生效的 UTC 偏移量。使用 .NET 的 DateTime.ToString("o")
会考虑夏令时在 DateTime 中表示的时间。
相同 FILETIME
的示例:ToString("o")
的输出:2017-06-21T12:00:00.0000000-05:00
链式 API 的输出:2017-06-21T12:00:00-06:00
来自链接的 API 调用的 UTC 偏移量是错误的。 .NET 的 DateTime
是如何做到的?我们如何在 Win32 中复制它?有没有像 GetTimeZoneinformationForYear
这样的东西,但不是一年,而是当地时间?
解决方法
首先,我使用 DYNAMIC_TIME_ZONE_INFORMATION
结构和 GetDynamicTimeZoneInformation
DYNAMIC_TIME_ZONE_INFORMATION
和 TIME_ZONE_INFORMATION
也有一个 DaylightBias
成员:
在发生的本地时间转换期间要使用的偏差值 在夏令时。如果值为 未提供 DaylightDate 成员。
这个值与Bias成员的值相加形成bias 在夏令时使用。在大多数时区,价值 这个成员是 –60。
因此,如果日期处于夏令时,则需要将此 DaylightBias
添加到 Bias
。
另外可以根据DaylightDate
中的描述判断当前日期是否为夏令时:
要选择月份中的正确日期,请将 wYear 成员设置为零, wHour 和 wMinute 成员到过渡时间,wDayOfWeek 成员到适当的工作日,wDay 成员表示 一个月内星期几的出现(1 到 5,其中 5 表示当月的最后一次发生,如果当天发生 一周不会出现 5 次)。
如果 wYear 成员不为零,则过渡日期是绝对的;它 只会发生一次。否则,它是发生的相对日期 每年一次。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。