如何使用Windows API在任何时区之间转换utc datetime?

时间:2016-10-13 10:40:45

标签: windows datetime timezone

我们正在寻找使用Windows API在时区(两个方向)之间转换utc日期时间的方法,即。使用由Microsoft维护的Windows时区数据。

这可能吗?

SystemTimeToTzSpecificLocalTimeEx和TzSpecificLocalTimeToSystemTimeEx似乎符合条例草案,但两者都需要正确的DYNAMIC_TIME_ZONE_INFORMATION,这会移动球门柱以获得正确的DYNAMIC_TIME_ZONE_INFORMATION结构。

GetTimeZoneInformation和GetDynamicTimeZoneInformation仅提供当前时区。

GetTimeZoneInformationForYear(转换过去日期时间所需)需要动态时区作为输入。

如何获得另一个时区的有效时区信息结构?

信息在注册表中,但作为TZI字段二进制文件,是否有关于如何将TZI字段解码为TIME_ZONE_INFORMATION的规范?

Win2012上有一个EnumDynamicTimeZoneInformation,但我们不能依赖它,因为我们需要支持Win2008R2 ......

PS: 使用TZDB满足我们的需求是有问题的,因为我们将负责在现场更新它。这个问题的一个关键方面是我们想要一种在TZ之间进行转换的方法,而不必自己维护和部署TZ信息,因为can change very quickly

1 个答案:

答案 0 :(得分:1)

枚举注册表似乎是唯一的方法,在https://msdn.microsoft.com/en-us/library/windows/desktop/ms725481(v=vs.85).aspx描述了TZI字段结构,如下所示

typedef struct _REG_TZI_FORMAT
{
    LONG Bias;
    LONG StandardBias;
    LONG DaylightBias;
    SYSTEMTIME StandardDate;
    SYSTEMTIME DaylightDate;
} REG_TZI_FORMAT;