获取Windows时区信息(C++/MFC)

获取Windows时区信息(C++/MFC),c++,windows,time,zone,zones,C++,Windows,Time,Zone,Zones,我正试图: 获取当用户从Windows控制面板选择时区时显示的时区名称列表,例如“UTC-08:00美国和加拿大太平洋时间”。 我通过阅读注册表中的“CurrentVersion\Time Zones”部分来实现这一点,该部分运行良好 以字符串形式获取当前选定的时区。 我可以使用GetTimeZoneInformation获取当前时区,但名称与从注册表的“CurrentVersion\time zones”部分检索到的时区列表不匹配。例如,太平洋时间在时区列表中显示为“UTC-08:00美国和加

我正试图:

获取当用户从Windows控制面板选择时区时显示的时区名称列表,例如“UTC-08:00美国和加拿大太平洋时间”。 我通过阅读注册表中的“CurrentVersion\Time Zones”部分来实现这一点,该部分运行良好

以字符串形式获取当前选定的时区。 我可以使用GetTimeZoneInformation获取当前时区,但名称与从注册表的“CurrentVersion\time zones”部分检索到的时区列表不匹配。例如,太平洋时间在时区列表中显示为“UTC-08:00美国和加拿大太平洋时间”,但GetTimeZoneInformation包含字符串“太平洋标准时间”和“太平洋夏令时”。我需要找到与“CurrentVersion\Time Zones”名称相对应的名称,以便从列表中选择它

根据字符串名称获取UTC和任何其他时区之间的当前偏移量(以分钟为单位)。 我可以在timeZoneInformation.Bias中检索UTC的偏移量,但这仅适用于当前选定的时区。我需要知道注册表中列出的任何区域的“偏差”,例如“UC-07:00美国和加拿大山区时间”,同时调整夏令时(如果有效)

TimeZoneInfo.Bias
时区信息结构-

SetTimeZoneInformation函数-

TimeZoneInfo类-
确定夏令时-

Microsoft选择将所需字符串放在不同的区域,有些字符串很难检索。但你的部分问题可以用你已经掌握的信息来回答

在CurrentVersion\时区中,是是区域的名称。 在该键内是所需部分的值

回复:“UTC-08:00美国和加拿大太平洋时间”

这在注册表值中显示在您拥有的区域名称下

资源DLL中有更多字符串,由值MUI_Display、MUI_Std和MUI_Dlt指定。它通常类似于@tzres.dll,-220

要获取这些字符串,您需要将资源DLL加载到内存中,并以UNICODE字符串的形式获取这些特定资源

回复:任何时区的分钟偏移量

在注册表项中,时区名称也是一个名为TZI的值。 这是一个二进制blob,根据MSDN,它如下所示:

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

当各种偏差以分钟为单位时,使用公式UTC=本地+偏差,偏差为偏差+标准偏差或偏差+日光偏差,具体取决于所讨论的日期。这两个系统时间值描述了转换日期。

不知道为什么我的编号列表以1,1,1结尾,但它应该是1,2,3。谢谢Null,但我已经在使用时区信息结构,这是我通过GetTimeZoneInformation获取当前时区的方式。你的例子展示了如何得到当前时间的偏移量,我已经提到了。我正在尝试从当前设置的时区以外的时区获取偏移量。[r] etrieve当前系统日期和时间。系统时间以协调世界时UTC表示。因此,您提出的答案的第一部分是错误的,第二部分重复OP已经在做的事情。它做得不对,就像选择有损数据类型来表示TZ偏差一样。对不起,那是-1。谢谢杰西,但我想知道你是否知道你正在回复我2012年的帖子?我想这对其他找到这条线索的人还是有帮助的。@SteveA-:是的,事实上,我知道这个问题已经过时了,而且我认为之前的答案还不够充分。我也知道你评论的年代。但是StackOverflow/StackExchange给我发了一封电子邮件,说我还没有处理这个评论,所以-D
typedef struct _REG_TZI_FORMAT
{
    LONG Bias;
    LONG StandardBias;
    LONG DaylightBias;
    SYSTEMTIME StandardDate;
    SYSTEMTIME DaylightDate;
} REG_TZI_FORMAT;