微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

文件时间到/从 ISO 8601 与 Win32 API正确使用夏令时?

如何解决文件时间到/从 ISO 8601 与 Win32 API正确使用夏令时?

用.NET写一些东西;它运作良好。现在我正在尝试使用 Win32 API 将其重写为 shell 扩展。最终,我想将 FILETIME 与 ISO-8601 字符串相互转换。这是可行的,不用大惊小怪,使用 GetTimeZoneinformationFileTimetoSystemTime 以及 SystemTimetoTzSpecificLocalTimeStringCchPrintfSYstemTIMETIME_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_INFORMATIONTIME_ZONE_INFORMATION 也有一个 DaylightBias 成员:

在发生的本地时间转换期间要使用的偏差值 在夏令时。如果值为 未提供 DaylightDate 成员。

这个值与Bias成员的值相加形成bias 在夏令时使用。在大多数时区,价值 这个成员是 –60。

因此,如果日期处于夏令时,则需要将此 DaylightBias 添加到 Bias。 另外可以根据DaylightDate中的描述判断当前日期是否为夏令时:

要选择月份中的正确日期,请将 wYear 成员设置为零, wHour 和 wMinute 成员到过渡时间,wDayOfWeek 成员到适当的工作日,wDay 成员表示 一个月内星期几的出现(1 到 5,其中 5 表示当月的最后一次发生,如果当天发生 一周不会出现 5 次)。

如果 wYear 成员不为零,则过渡日期是绝对的;它 只会发生一次。否则,它是发生的相对日期 每年一次。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。