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

2019-06-27 08:44发布

我试着:

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

我这样做,通过阅读“CURRENTVERSION \ Time区域”效果很好注册表的部分。

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

我可以使用GetTimeZoneInformation()当前时区,但名称不匹配从注册表中的“CURRENTVERSION \时区”一节中检索时区的列表。 例如,太平洋时间显示为“(UTC-08:00)太平洋时间(美国和加拿大)”时区的名单,但GetTimeZoneInformation()包含字符串“太平洋标准时间”和“太平洋夏令时间”。 我需要找到对应于“CURRENTVERSION \时区”的名字命名,那么可以从列表中选择它。

  1. 获取UTC和基于字符串名称的任何其他时区之间的电流偏移量(以分钟为单位)。

我可以检索从timeZoneInformation.Bias UTC的偏移量,但这只是针对目前选择的时区。 我需要知道的任何区域中的“偏见”的注册表中列出的(例如,“(UC-07:00)山地时间(美国和加拿大)”,而如果效果调整为夏令时。

Answer 1:

微软选择让你在不同区域要的字符串,某些字符串是不平凡检索。 但是你的问题的部件都可以用你已经的信息来回答。

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;

其中各种BIAS是以分钟,使用等式UTC =本地+ theBiastheBias要么偏置+ StandardBias偏置+取决于所讨论的日期DaylightBias。 这两个SYSTEMTIME值描述的转换日期。



Answer 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



文章来源: Getting Windows Time Zone Information (C++/MFC)