我想同步Windows和Linux时钟。Windows获取其系统时钟(使用GetSystemTimeAsFileTime函数)并将其发送到Linux。然后,Linux相应地设置其时钟(使用settimeofday函数)。我还需要传输Windows的时区,并将其转换为Linux标准。如何在C++中获得Windows的时区?祝你好运穆斯塔法
8fsztsew1#
GetTimeZoneInformation可能是你要找的。
a11xaf1n2#
即使您不是同步到标准时间,而是同步到计算机之间的时间,也应该使用NTP。NTP是一个成熟、强大的协议,它已经解决了你将要发现或已经发现的一系列问题:发现,通信传输,延迟和抖动,时区差异,管理漂移,以便您不会混淆共享同一台机器的其他进程,实际正确设置时间,权限等。只需在您想要作为主服务器的机器上设置NTP服务器,并在另一台机器上设置NTP客户端,查询主服务器。简单而轻松。自从我设置NTP服务器以来已经有一段时间了;我假设您可以使用操作系统标配的NTP实用程序以最少的配置完成这项工作,只要您对这些机器具有管理员权限。
8ljdwjyq3#
GetDynamicTimeZoneInformation是一个更有用的函数。它还提供了时区的注册表项。http://msdn.microsoft.com/en-us/library/windows/desktop/ms724318(v=vs.85).aspx
ccrfmcuu4#
下面是我在项目中应用的C++中获取时区的示例代码。我为谁分担关心。
TIME_ZONE_INFORMATION TimeZoneInfo; GetTimeZoneInformation(&TimeZoneInfo); int TimeZoneDifference = -(int(TimeZoneInfo.Bias) / 60);
wixjitnu5#
GetDynamicTimeZoneInformation并不总是有效。最低支持的版本是Windows Vista,Windows Server 2008和Windows Phone 8。因此对于低于GetTimeZoneInformation的任何版本都更好。然而另一个问题是有时候两者都返回StandardName或DaylightName空。在这种情况下,你必须使用windows注册表。下面是从gnu cash中提取的函数,也是从glib修改的。
GetDynamicTimeZoneInformation
GetTimeZoneInformation
StandardName
DaylightName
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); }
eblbsuwk6#
这是对我和windows和linux之间的端口起作用的
#include "time.h" ... time_t now = time(NULL); struct tm utctm; utctm = *gmtime(&now); utctm.tm_isdst = -1; time_t utctt = mktime(&utctm); // diff is the offset in seconds long diff = now - utctt;
6条答案
按热度按时间8fsztsew1#
GetTimeZoneInformation可能是你要找的。
a11xaf1n2#
即使您不是同步到标准时间,而是同步到计算机之间的时间,也应该使用NTP。
NTP是一个成熟、强大的协议,它已经解决了你将要发现或已经发现的一系列问题:发现,通信传输,延迟和抖动,时区差异,管理漂移,以便您不会混淆共享同一台机器的其他进程,实际正确设置时间,权限等。
只需在您想要作为主服务器的机器上设置NTP服务器,并在另一台机器上设置NTP客户端,查询主服务器。简单而轻松。
自从我设置NTP服务器以来已经有一段时间了;我假设您可以使用操作系统标配的NTP实用程序以最少的配置完成这项工作,只要您对这些机器具有管理员权限。
8ljdwjyq3#
GetDynamicTimeZoneInformation是一个更有用的函数。它还提供了时区的注册表项。
http://msdn.microsoft.com/en-us/library/windows/desktop/ms724318(v=vs.85).aspx
ccrfmcuu4#
下面是我在项目中应用的C++中获取时区的示例代码。
我为谁分担关心。
wixjitnu5#
GetDynamicTimeZoneInformation
并不总是有效。最低支持的版本是Windows Vista,Windows Server 2008和Windows Phone 8。因此对于低于GetTimeZoneInformation
的任何版本都更好。然而另一个问题是有时候两者都返回
StandardName
或DaylightName
空。在这种情况下,你必须使用windows注册表。下面是从gnu cash中提取的函数,也是从glib修改的。eblbsuwk6#
这是对我和windows和linux之间的端口起作用的