Få tidzone i Windows med C ++

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg vil synkronisere Windows og Linux-ure. Windows får sin systemur (med GetSystemTimeAsFileTime-funktion) og sender den til Linux. Derefter sætter Linux klokken i overensstemmelse hermed (med funktionen setimeofday).


Jeg skal også overføre Windows-tidszonen og konvertere den til Linux-standard. Hvordan kan jeg få tidszone for Windows i C ++?


Bedste ønsker,
Mustafa

Bedste reference


GetTimeZoneInformation er nok det, du leder efter. [6]

Andre referencer 1


Selvom du ikke synkroniserer med standard tid, men til tiden mellem maskiner, skal du bruge NTP.


NTP er en moden og robust protokol, der har løst hele stakken af ​​problemer, som du vil finde eller allerede har fundet: opdagelse, comms transport, latency og jitter, tidszoneforskelle, styring af drift, så du ikke forvirrer andre processer, der deler Den samme maskine (r), der faktisk sætter tiden korrekt, tilladelser mv.


Du skal blot oprette en NTP-server på den maskine, du vil have som en mester, og konfigurere NTP-klienten på den anden maskine ved at spørge masteren. Enkel og smertefri.


Det har været et stykke tid siden jeg opsatte NTP-servere, og jeg antager, at du kan bruge NTP-værktøjerne, der kommer til at fungere som operativsystemerne til at udføre jobbet med mindst konfiguration, så længe du har administratorrettigheder på boksene.

Andre referencer 2


GetDynamicTimeZoneInformation er mere nyttigt funktion. det giver også registreringsdatabasenøglen for tidszonen ..


http://msdn.microsoft.com/en-us/library/windows/desktop/ms724318(v=vs.85).aspx[7]

Andre referencer 3


GetDynamicTimeZoneInformation fungerer ikke altid. Mindst understøttede versioner er Windows Vista, Windows Server 2008 og Windows Phone 8. Så for alt under det GetTimeZoneInformation er det bedre.


Men et andet problem er begge to gange tilbage StandardName eller DaylightName tom. I så fald skal du bruge Windows-registreringsdatabasen. Her er funktionen taget fra gnu cash, som også blev ændret fra 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);
}