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



我正在尝试:

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

我通过阅读注册表的"CurrentVersion\时区"部分来做到这一点,该部分运行良好。

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

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

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

我可以在timeZoneInformation.Bias中检索UTC的偏移量,但这仅适用于当前选定的时区。我需要知道注册表中列出的任何区域的"偏差"(例如,"(UC-07:00)山地时间(美国和加拿大)",同时调整夏令时(如果有效)。

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

CurrentVersion\时区中,yes是区域的名称。中,键是您想要的某些部分的值。

re:"(UTC-08:00)太平洋时间(美国和加拿大)"

这在您拥有的区域名称下的注册表值"Display"中。

资源DLL中有更多的字符串,由值"MUI_Display"、"MUI_Std"one_answers"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+StandardBiasBIAS+DaylightBias,具体取决于相关日期。两个SYSTEMTIME值描述转换日期。

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

最新更新