我想同步Windows和Linux時鐘。 Windows獲取系統時鐘(使用GetSystemTimeAsFileTime函數)並將其發送到Linux。然後,Linux相應地設置其時鐘(使用settimeofday函數)。使用C++在Windows中獲取時區
我還需要傳輸Windows的時區,並將其轉換爲Linux標準。我如何在C++中獲得Windows的時區?
最良好的祝願, 穆斯塔法
我想同步Windows和Linux時鐘。 Windows獲取系統時鐘(使用GetSystemTimeAsFileTime函數)並將其發送到Linux。然後,Linux相應地設置其時鐘(使用settimeofday函數)。使用C++在Windows中獲取時區
我還需要傳輸Windows的時區,並將其轉換爲Linux標準。我如何在C++中獲得Windows的時區?
最良好的祝願, 穆斯塔法
GetTimeZoneInformation可能是你在找什麼。
謝謝,是的,它是。它會返回TIME_ZONE_INFORMATION結構,它包含偏移(以分鐘爲單位的長整數)和區域的名稱。由於Linux中區域的名稱不同,我認爲使用Bias設置Linux時區會更好。但是,我找不到使用Bias設置Linux時區的方法。用GMT + x導出TZ在我的Ubuntu上不起作用, – mustafa
GetDynamicTimeZoneInformation是更有用的函數。它給出了時區也註冊表項..
http://msdn.microsoft.com/en-us/library/windows/desktop/ms724318(v=vs.85).aspx
即使您是否未同步到標準時間,但機器之間的時候,你應該使用NTP。
NTP是一個成熟的,健壯的協議,它解決了您將要發現或已經發現的所有問題:發現,通信傳輸,延遲和抖動,時區差異,管理漂移,所以您不需要混淆共享相同機器的其他進程,正確設置時間,權限等。
只需在想要作爲主機的機器上設置NTP服務器,並在另一臺機器上設置NTP客戶機,詢問主人。簡單而無痛。
自從我設置NTP服務器已經有一段時間了;我假設您可以使用標準操作系統的NTP實用程序以最低限度的配置完成這項工作,只要您具有管理員權限即可。
GetDynamicTimeZoneInformation
並不總是有效。支持的最低版本是Windows Vista,Windows Server 2008和Windows Phone 8.因此,對於低於GetTimeZoneInformation
的任何版本都更好。
但是另一個問題是有時候會返回StandardName
或DaylightName
爲空。在這種情況下,你必須使用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);
}
你已經試過了什麼?你有沒有遇到任何問題? –
當你說'linux標準'是指UTC?你用UTC時鐘運行你的Linux機器嗎?不[GetSystemTimeAsFileTime](http://msdn.microsoft.com/en-us/library/ms724397.aspx)返回UTC?將兩者同步到第三個NTP服務器或在其中一個盒子上運行NTP服務器並使用它們會更好嗎?兩個操作系統都有NTP客戶端可用/內置。 – Rup
在許多情況下,NTP將是最佳選擇。但在這種情況下,我需要將它們彼此同步,而不是實時。 – mustafa