2012-08-24 77 views
3

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

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

我这样做是通过阅读注册表中的“CurrentVersion \ Time Zones”部分来实现的。

  1. 获取当前选定的时区作为字符串。

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

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

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

谢谢!

+0

不知道为什么我的编号列表结束了1.,1.,1,但它应该是1,2,3. –

回答

1
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

+0

感谢Null,但我已经在使用TIME_ZONE_INFORMATION结构,这是我如何获得当前时区通过GetTimeZoneInformation()。你的例子展示了如何获得当前时间的偏移量,我提到我已经可以做到了。我试图从除当前设置的时区以外的时区获得偏移量。 –

+0

[GetSystemTime](https://msdn.microsoft.com/en-us/library/windows/desktop/ms724390.aspx)*“[r]检索当前系统的日期和时间。系统时间用Coordinated Universal时间(UTC)“。*所以你提出的答案的第一部分是错误的,第二部分重新重复,OP已经做了什么。它也做错了(比如选择有损数据类型来表示TZ偏差)。对不起,这是一个-1。 – IInspectable

3

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

CurrentVersion \ Time Zones,yes是区域的名称。 里面该密钥是一些你想要的部分的值。

重:“(UTC-08:00)太平洋时间(美国&加拿大)”

这是在你的区域名称的注册表值 “显示”。

有在资源DLL多个字符串,由值“MUI_Display”,“MUI_Std”和“MUI_Dlt”规定。它通常是类似“@tzres。DLL,-220"

要获得这些字符串,你需要的是资源DLL加载到内存中,并获取这些特定资源的Unicode字符串中

重:。抵消了分钟任何时区

还你的注册表项中(时区名称)是一家名为“TZI”值 这是(根据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值描述了转换日期。

+0

谢谢杰西,但我不知道你是否知道你正在回复我的2012年职位?我想这对于找到这个主题的其他人还是有帮助的。 –

+1

@SteveA - :)是的,实际上,我意识到问题的年龄及其(在我看来不足)以前的答案。我也知道你评论的年龄。但是StackOverflow/StackExchange向我发送了一封我尚未处理此评论的电子邮件,所以...... ;-D –