Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用C+在Windows中获取时区+;_C++_Windows_Linux_Timezone - Fatal编程技术网

C++ 使用C+在Windows中获取时区+;

C++ 使用C+在Windows中获取时区+;,c++,windows,linux,timezone,C++,Windows,Linux,Timezone,我想同步Windows和Linux时钟。Windows获取其系统时钟(使用GetSystemTimeAsFileTime函数)并将其发送到Linux。然后,Linux相应地设置其时钟(使用settimeofday函数) 我还需要传输Windows的时区,并将其转换为Linux标准。如何在C++中获得Windows的时区?< /P> 致以最良好的祝愿, Mustafa可能是您正在寻找的功能。GetDynamicTimeZoneInformation是更有用的功能。它还提供了时区的注册表项 即使您没

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

我还需要传输Windows的时区,并将其转换为Linux标准。如何在C++中获得Windows的时区?< /P> 致以最良好的祝愿,
Mustafa可能是您正在寻找的功能。

GetDynamicTimeZoneInformation是更有用的功能。它还提供了时区的注册表项


即使您没有同步到标准时间,但要同步到机器之间的时间,也应该使用NTP

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

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


我已经有一段时间没有设置NTP服务器了;我假设您可以使用操作系统附带的标准NTP实用程序,以最少的配置完成这项工作,只要您对这些框具有管理员权限。

GetDynamicTimeZoneInformation
并不总是有效。受支持的最低版本为Windows Vista、Windows Server 2008和Windows Phone 8。因此,对于低于
的任何内容,GetTimeZoneInformation
更好

然而,另一个问题是有时返回
StandardName
DaylightName
空。在这种情况下,您必须使用windows注册表。这里的函数取自GNUCash,它也是从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);
}

你已经试过什么了?您的尝试是否遇到任何问题?当您说“linux标准”时,您指的是UTC?您是否使用UTC时钟运行Linux机器?不返回UTC吗?将两者同步到第三台NTP服务器或在其中一个机箱上运行NTP服务器并使用它不是更好吗?两个操作系统都有可用/内置的NTP客户端。在许多情况下,NTP是最佳选择。但是在这种情况下,我需要将它们彼此同步,而不是实时同步。谢谢,是的,是的。它返回TIME_ZONE_INFORMATION struct,其中包括偏差(以分钟为单位的长整数)和区域名称。由于Linux中区域的名称不同,我认为最好使用Bias来设置Linux时区。但是,我找不到使用Bias设置Linux时区的方法。用GMT+x导出TZ在我的Ubuntu上不起作用,