4

我试着:

  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)山区时间(美国和加拿大)”,同时调整夏令时(如果有效)。

4

2 回答 2

4
于 2014-06-25T13:55:28.433 回答
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

于 2012-08-24T16:22:56.997 回答