2011-08-15 78 views
6

我想同步Windows和Linux時鐘。 Windows獲取系統時鐘(使用GetSystemTimeAsFileTime函數)並將其發送到Linux。然後,Linux相應地設置其時鐘(使用settimeofday函數)。使用C++在Windows中獲取時區

我還需要傳輸Windows的時區,並將其轉換爲Linux標準。我如何在C++中獲得Windows的時區?

最良好的祝願, 穆斯塔法

+0

你已經試過了什麼?你有沒有遇到任何問題? –

+1

當你說'linux標準'是指UTC?你用UTC時鐘運行你的Linux機器嗎?不[GetSystemTimeAsFileTime](http://msdn.microsoft.com/en-us/library/ms724397.aspx)返回UTC?將兩者同步到第三個NTP服務器或在其中一個盒子上運行NTP服務器並使用它們會更好嗎?兩個操作系統都有NTP客戶端可用/內置。 – Rup

+0

在許多情況下,NTP將是最佳選擇。但在這種情況下,我需要將它們彼此同步,而不是實時。 – mustafa

回答

9

GetTimeZoneInformation可能是你在找什麼。

+1

謝謝,是的,它是。它會返回TIME_ZONE_INFORMATION結構,它包含偏移(以分鐘爲單位的長整數)和區域的名稱。由於Linux中區域的名稱不同,我認爲使用Bias設置Linux時區會更好。但是,我找不到使用Bias設置Linux時區的方法。用GMT + x導出TZ在我的Ubuntu上不起作用, – mustafa

3

即使您是否未同步到標準時間,但機器之間的時候,你應該使用NTP。

NTP是一個成熟的,健壯的協議,它解決了您將要發現或已經發現的所有問題:發現,通信傳輸,延遲和抖動,時區差異,管理漂移,所以您不需要混淆共享相同機器的其他進程,正確設置時間,權限等。

只需在想要作爲主機的機器上設置NTP服務器,並在另一臺機器上設置NTP客戶機,詢問主人。簡單而無痛。

自從我設置NTP服務器已經有一段時間了;我假設您可以使用標準操作系統的NTP實用程序以最低限度的配置完成這項工作,只要您具有管理員權限即可。

0

GetDynamicTimeZoneInformation並不總是有效。支持的最低版本是Windows Vista,Windows Server 2008和Windows Phone 8.因此,對於低於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); 
} 
相關問題