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

我试图:

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

我正在通过阅读registry中的“CurrentVersion \ Time Zones”部分来运行。

  1. 获取当前选定的时区作为string。

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

  1. 获取UTC和任何其他时区之间基于string名称的当前偏移量(以分钟为单位)。

我可以从timeZoneInformation.Bias中检索UTC的偏移量,但这只适用于当前选定的时区。 我需要知道在registry中列出的任何区域(例如,“(UC-07:00)Mountain Time(美国和加拿大)”)的“偏见”,同时调整夏令时。

谢谢!

微软选择把你想要的字符串放在一个不同的区域,一些字符串是不重要的检索。 但是你的问题的一部分可以用你已经有的信息来回答。

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

re: “(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; 

在各种BIAS在几分钟内,使用公式UTC =本地+ theBiastheBias要么是偏见+ StandardBias偏见+ 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/zh-cn/library/bb396389确定夏令时 – http://www.metatrader4.com/forum/2155