【问题标题】:Getting Windows Time Zone Information (C++/MFC)获取 Windows 时区信息 (C++/MFC)
【发布时间】:2012-08-20 04:42:25
【问题描述】:

我正在尝试:

  1. 获取当用户从 Windows 控制面板选择时区时出现的时区名称列表(例如,“(UTC-08:00) 太平洋时间(美国和加拿大)”)。

我通过阅读注册表中运行良好的“CurrentVersion\Time Zones”部分来做到这一点。

  1. 以字符串形式获取当前选择的时区。

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

  1. 根据字符串名称获取 UTC 与任何其他时区之间的当前偏移量(以分钟为单位)。

我可以在 timeZoneInformation.Bias 中检索与 UTC 的偏移量,但这仅适用于当前选择的时区。我需要知道注册表中列出的任何区域的“偏差”(例如,“(UC-07:00) Mountain Time (US & Canada)”,同时调整夏令时(如果有效)。

【问题讨论】:

  • 不知道为什么我的编号列表最终是 1.、1.、1,但它应该是 1、2、3。

标签: c++ windows time zone zones


【解决方案1】:

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

CurrentVersion\Time Zones 中,yes 是区域的名称。 里面那个键是你想要的一些部分的值。

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

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

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

要获取这些字符串,您需要将该资源 DLL 加载到内存中并将这些特定资源作为 UNICODE 字符串获取。

re:任何时区的分钟偏移量。

在您拥有的注册表项(时区名称)中还有一个名为 "TZI" 的值。 这是一个二进制 blob(根据 MSDN),如下所示:

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

各种 BIAS 以分钟为单位,使用等式 UTC = local + theBiastheBiasBias + StandardBias偏差 + DaylightBias 取决于相关日期。两个 SYSTEMTIME 值描述了转换日期。

【讨论】:

  • 感谢 Jesse,但我想知道您是否知道您正在回复我 2012 年的帖子?我想它对其他找到这个帖子的人仍然有帮助。
  • @SteveA - :) 是的,实际上,我知道问题的年龄及其(在我看来不够充分的)之前的答案。我也知道你评论的年龄。但是 StackOverflow/StackExchange 给我发了一封电子邮件,说我还没有处理这个评论,所以.... ;-D
【解决方案2】:
TimeZoneInfo.Bias

TIME_ZONE_INFORMATION 结构 - http://msdn.microsoft.com/en-us/library/windows/desktop/ms725481(v=vs.85).aspx

SetTimeZoneInformation 函数 - http://msdn.microsoft.com/en-us/library/windows/desktop/ms724944(v=vs.85).aspx

  // Get the local system time.
SYSTEMTIME LocalTime = { 0 };
GetSystemTime( &LocalTime );

// Get the timezone info.
TIME_ZONE_INFORMATION TimeZoneInfo;
GetTimeZoneInformation( &TimeZoneInfo );

// Convert local time to UTC.
SYSTEMTIME GmtTime = { 0 };
TzSpecificLocalTimeToSystemTime( &TimeZoneInfo,
                                 &LocalTime,
                                 &GmtTime );

// GMT = LocalTime + TimeZoneInfo.Bias
// TimeZoneInfo.Bias is the difference between local time
// and GMT in minutes.

// Local time expressed in terms of GMT bias.
float TimeZoneDifference = -( float(TimeZoneInfo.Bias) / 60 );
CString csLocalTimeInGmt;
csLocalTimeInGmt.Format( _T("%ld:%ld:%ld + %2.1f Hrs"),
                         GmtTime.wHour,
                         GmtTime.wMinute,
                         GmtTime.wSecond,
                         TimeZoneDifference );

TimeZoneInfo 类 - http://msdn.microsoft.com/en-us/library/bb396389 确定夏令时 - http://www.metatrader4.com/forum/2155

【讨论】:

  • 谢谢 Null,但我已经在使用 TIME_ZONE_INFORMATION 结构,这就是我通过 GetTimeZoneInformation() 获取当前时区的方式。您的示例显示了如何获取我已经提到的当前时间的偏移量。我正在尝试从当前设置的时区以外的时区获取偏移量。
  • GetSystemTime "[r]获取当前系统日期和时间。系统时间以协调世界时 (UTC) 表示。" 所以你的第一部分提出的答案是错误的,第二个重复了 OP 已经在做什么。它也做错了(比如选择有损数据类型来表示 TZ 偏差)。抱歉,这是 -1。
猜你喜欢
  • 2016-05-07
  • 2013-08-09
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-06
  • 2011-08-12
  • 2011-03-08
相关资源
最近更新 更多