用C ++在Windows中获取时区

我想同步Windows和Linux时钟。 Windows获取系统时钟(使用GetSystemTimeAsFileTime函数)并将其发送到Linux。 然后,Linux相应地设置它的时钟(使用settimeofday函数)。

我还需要传输Windows的时区,并将其转换为Linux标准。 我怎样才能得到C ++的Windows的时区?

最好的祝愿,穆斯塔法

GetTimeZoneInformation可能是你在找什么。

即使你不是同步到标准时间,但是到机器之间的时间,你应该使用NTP。

NTP是一个成熟的,健壮的协议,它解决了你将要发现或已经发现的所有问题:发现,通信传输,延迟和抖动,时区差异,管理漂移,所以你不要混淆其他进程共享相同的机器,正确设置时间,权限等。

只需在您想要的机器上设置NTP服务器作为主机,并在另一台机器上设置NTP客户机,查询主机。 简单而无痛。

我建立NTP服务器已经有一段时间了, 我假设您可以使用操作系统标准的NTP实用程序以最低限度的配置完成这项工作,只要您具有管理员权限即可。

GetDynamicTimeZoneInformation是更有用的功能。 它也给时区的注册表键。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms724318(v=vs.85).aspx

GetDynamicTimeZoneInformation不总是工作。 受支持的最低版本是Windows Vista,Windows server 2008和Windows Phone 8.因此,对于低于GetTimeZoneInformation任何内容, GetTimeZoneInformation会更好。

但是另一个问题是有时候返回StandardNameDaylightName空。 在这种情况下,你必须使用Windows注册表。 这是从gibu现金,也是从glib修改的功能。

 static std::string windows_default_tzname(void) { const char *subkey = "SYSTEM\\CurrentControlSet\\Control\\TimeZoneInformation"; constexpr size_t keysize{128}; HKEY key; char key_name[keysize]{}; unsigned long tz_keysize = keysize; if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, subkey, 0, KEY_QUERY_VALUE, &key) == ERROR_SUCCESS) { if (RegQueryValueExA(key, "TimeZoneKeyName", nullptr, nullptr, (LPBYTE)key_name, &tz_keysize) != ERROR_SUCCESS) { memset(key_name, 0, tz_keysize); } RegCloseKey(key); } return std::string(key_name); }