2011-08-15 22 views
6

WindowsとLinuxのクロックを同期したい。 Windowsはシステムクロック(GetSystemTimeAsFileTime機能付き)を取得し、Linuxに送信します。そして、Linuxはそれに応じて時計を設定します(settimeofday関数を使って)。C++でWindowsでタイムゾーンを取得する

また、Windowsのタイムゾーンを送信し、Linux標準に変換する必要があります。 C++でWindowsのタイムゾーンを取得するにはどうすればよいですか?

最高の願い、 ムスタファ

+0

何を試しましたか?あなたの試行で何か問題が発生しましたか? –

+1

あなたは 'linux standard'と言うとUTCを意味するのですか? LinuxマシンをUTCクロックで動作させていますか? [GetSystemTimeAsFileTime](http://msdn.microsoft.com/en-us/library/ms724397.aspx)はUTCを返しますか? 3つ目のNTPサーバーに両方を同期させたり、1つのボックスでNTPサーバーを実行して使用する方が良いでしょうか?どちらのOSもNTPクライアントを利用可能/内蔵しています。 – Rup

+0

多くの場合、NTPが最適です。しかし、この場合、リアルタイムではなく、お互いを同期させる必要があります。 – mustafa

答えて

9

GetTimeZoneInformationは、あなたが探しているものと考えられます。

+1

ありがとう、はい、そうです。 Bias(分単位の長い整数)とゾーンの名前の両方を含むTIME_ZONE_INFORMATION構造体を返します。 Linuxのゾーンの名前は異なるので、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が良いです。

ただし、別の問題が両方とも時々StandardNameまたはDaylightNameを返します。その場合は、Windowsレジストリを使用する必要があります。 glibから変更されたgnu現金から取った関数を次に示します。

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); 
}