代码之家  ›  专栏  ›  技术社区  ›  Jonathan M Davis

如何在Windows中获取任意时区的信息?

  •  10
  • Jonathan M Davis  · 技术社区  · 15 年前

    理想情况下,我想能够做的是取一个时区的名称,并向Windows询问其相应的时区信息(从UTC的偏移量、DST偏移量、DST开关的日期等)。看起来Windows使用 TIME_ZONE_INFORMATION 结构来保存此类信息。所以,假设我想要一个函数,它接受一个带有时区名称的字符串,并返回一个时区信息结构。

    但是,我能找到的只是一些函数,比如 GetTimeZoneInformation() 给我当地时间的时区信息。我需要的是一个函数,它将为我提供任意时区的信息,而不管本地时区是什么。

    我看到获取这些信息的唯一方法是直接从注册表中获取,这不太理想。这个 TIME_ZONE_INFORMATION page 显示它在注册表中的位置,因此应该可以从那里获取信息,但我更希望有一个合适的系统函数。是否存在这样的函数,或者我是否必须进行注册表潜水以获取任意时区的时区信息?

    2 回复  |  直到 15 年前
        1
  •  10
  •   Mark Ransom    15 年前

    时区信息作为二进制数据包含在下面的注册表中 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\(zone name)\TZI . 数据结构在时区信息文档中给出:

    struct STimeZoneFromRegistry
    {
     long  Bias;
     long  StandardBias;
     long  DaylightBias;
     SYSTEMTIME StandardDate;
     SYSTEMTIME DaylightDate;
    };
    

    下面是读取密钥的示例代码:

    TIME_ZONE_INFORMATION tz = {0};
    STimeZoneFromRegistry binary_data;
    DWORD size = sizeof(binary_data);
    HKEY hk = NULL;
    TCHAR zone_key[] = _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones\\Central Standard Time");
    if ((RegOpenKeyEx(HKEY_LOCAL_MACHINE, zone_key, 0, KEY_QUERY_VALUE, &hk) == ERROR_SUCCESS) &&
     (RegQueryValueEx(hk, "TZI", NULL, NULL, (BYTE *) &binary_data, &size) == ERROR_SUCCESS))
    {
     tz.Bias = binary_data.Bias;
     tz.DaylightBias = binary_data.DaylightBias;
     tz.DaylightDate = binary_data.DaylightDate;
     tz.StandardBias = binary_data.StandardBias;
     tz.StandardDate = binary_data.StandardDate;
    }
    

    编辑: 抱歉,这个答案是多余的-我相信您可以使用您在问题中链接到的文档来解决所有这些问题。我只需要做一次,这是我唯一能找到的方法。

    推荐文章