我想同步Windows和Linux的时钟。Windows获取其系统时钟(使用GetSystemTimeAsFileTime函数)并将其发送给Linux。然后,Linux设置相应的时钟(使用settimeofday函数)。
我还需要传输Windows的时区,并将其转换为Linux标准。如何在c++中获得Windows的时区?
最好的祝愿,穆斯塔法
GetTimeZoneInformation可能就是您正在寻找的。
即使您不同步到标准时间,而是同步到机器之间的时间,您也应该使用NTP。
NTP是一个成熟的,健壮的协议,已经解决了整个堆栈的问题,你会发现,或已经发现:发现,通信传输,延迟和抖动,时区差异,管理漂移,这样你就不会混淆其他进程共享同一台机器(s),实际设置正确的时间,权限等。
只需在您想要的机器上设置NTP服务器作为主服务器,并在另一台机器上设置NTP客户端,查询主服务器。简单无痛。
我设置NTP服务器已经有一段时间了;我假设您可以使用操作系统标准自带的NTP实用程序以最少的配置完成这项工作,只要您在这些机器上具有管理员权限即可。
GetDynamicTimeZoneInformation是更有用的功能。它还提供了时区的注册表项。
http://msdn.microsoft.com/en-us/library/windows/desktop/ms724318 (v = vs.85) . aspx
下面是我在我的项目中应用的c++中获取时区的示例代码。
我为谁分享关心。
TIME_ZONE_INFORMATION TimeZoneInfo;
GetTimeZoneInformation(&TimeZoneInfo);
int TimeZoneDifference = -(int(TimeZoneInfo.Bias) / 60);
GetDynamicTimeZoneInformation
并不总是工作。最低支持的版本是Windows Vista、Windows Server 2008和Windows Phone 8。所以低于这个值,GetTimeZoneInformation
更好。
然而,另一个问题是有时都返回StandardName
或DaylightName
空。在这种情况下,你必须使用windows注册表。下面这个函数取自gnu cash,也是由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);
}
这是我的工作和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;