7
votes

Obtenir le fuseau horaire avec Windows avec C ++

Je veux synchroniser les horloges Windows et Linux. Windows obtient son horloge système (avec la fonction GetSystemTimeasFileTime) et l'envoie à Linux. Ensuite, Linux définit son horloge en conséquence (avec la fonction de SettimeOfDay).

J'ai également besoin de transmettre le fuseau horaire de Windows et de le convertir en standard Linux. Comment puis-je obtenir le fuseau horaire de Windows en C ++?

meilleurs voeux, Mustafa


3 commentaires

Qu'avez-vous déjà essayé? Avez-vous rencontré des problèmes avec vos tentatives?


Lorsque vous dites 'Standard Linux', vous voulez dire UTC? Exécutez-vous votre machine Linux avec une horloge UTC? Ne getSystemTimeasFileTime retour uc? Ne serait-il pas préférable de synchroniser à la fois à un troisième serveur NTP ou d'exécuter un serveur NTP sur l'une des cases et d'utiliser cela? Les deux OSES ont des clients NTP disponibles / intégrés.


NTP serait le meilleur choix dans de nombreux cas. Mais dans ce cas, j'ai besoin de les synchroniser les uns aux autres, pas trop en temps réel.


5 Réponses :


9
votes

Gestion GetTimezoneInformation est probablement quoi Vous cherchez.


1 commentaires

Merci oui, c'est. Il renvoie Time_Zone_Information STRT qui inclut les deux biais (entier long en minutes) et le nom de la zone. Étant donné que les noms des zones de Linux sont différents, je pense qu'il est préférable d'utiliser un biais pour définir le fuseau horaire Linux. Cependant, je n'ai pas pu trouver un moyen de définir le fuseau horaire Linux à l'aide de biais. L'exportation de TZ avec GMT + X ne fonctionne pas sur mon Ubuntu,



2
votes

GetDynamicticimeZoneInformation est une fonction plus utile. Il donne également à la clé de registre pour Timezone ..

http: // msdn .microsoft.com / fr-US / Bibliothèque / Windows / Bureau / MS724318 (v = vs.85) .aspx


0 commentaires

5
votes

Même si vous ne synchronisez pas à l'heure standard, mais à temps entre les machines, vous devez utiliser NTP.

NTP est un protocole mûr et robuste qui a résolu toute la pile de problèmes que vous allez trouver ou avez déjà trouvé: découverte, transport de communication, la latence et la gigue, les différences de fusé-tempone, la gestion de la dérive afin de ne pas confondre Autres processus partageant la même machine (s), définissant le temps correctement, les autorisations, etc.

Définissez simplement un serveur NTP sur la machine que vous souhaitez en tant que maître et configurez le client NTP sur l'autre machine, interrogeant le maître. Simple et indolore.

Cela fait longtemps que je configurais des serveurs NTP; Je suppose que vous pouvez utiliser les utilitaires NTP qui se présentent standard avec les systèmes d'exploitation pour effectuer le travail avec une configuration minimale, à condition de disposer de privilèges d'administration sur les cases.


0 commentaires

0
votes

getDynamicticimezoneInformation code> ne fonctionne pas toujours. Les versions minimales prises en charge sont Windows Vista, Windows Server 2008 et Windows Phone 8. Donc, pour que quelque chose ci-dessous que gettimezoneInformation code> est meilleur.

Cependant, un autre problème est parfois de retourner standardname code> ou daylightName code> vide. Dans ce cas, vous devez utiliser le registre Windows. Voici la fonction prise à partir de GNU Cash, qui a également été modifiée de GLIB. P>

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


0 commentaires

0
votes

C'est ce qui fonctionne pour moi et ports entre Windows et Linux

#include "time.h"
...
time_t now = time(NULL);
struct tm utctm;
utctm = *gmtime(&now);
utctm.tm_isdst = -1;
time_t utctt = mktime(&utctm);
// diff is the offset in seconds
long diff = now - utctt;


0 commentaires