web-dev-qa-db-fra.com

Conversion entre les heures locales et GMT / UTC en C / C ++

Quelle est la meilleure façon de convertir des heures entre l'heure locale et UTC en C/C++?

Par "datetime", je veux dire une représentation du temps qui contient la date et l'heure. Je serai content de time_t, struct tm, ou toute autre représentation qui le rend possible.

Ma plateforme est Linux.

Voici le problème spécifique que j'essaie de résoudre: j'obtiens une paire de valeurs contenant une date julienne et un nombre de secondes dans la journée. Ces valeurs sont en GMT. J'ai besoin de convertir cela en une valeur "YYYYMMDDHHMMSS" de fuseau horaire local. Je sais comment convertir la date julienne en Y-M-D, et il est évidemment facile de convertir des secondes en HHMMSS. Cependant, la partie délicate est la conversion du fuseau horaire. Je suis sûr que je peux trouver une solution, mais je préférerais trouver un moyen "standard" ou "bien connu" plutôt que de trébucher.


Une question peut-être liée est Obtenir les dates de transition de l'heure d'été pour les fuseaux horaires en C

30
Kristopher Johnson

Vous êtes censé utiliser des combinaisons de gmtime/localtime et timegm/mktime. Cela devrait vous donner les outils orthogonaux pour effectuer des conversions entre struct tm Et time_t.

Pour UTC/GMT:

time_t t;
struct tm tm;
struct tm * tmp;
...
t = timegm(&tm);
...
tmp = gmtime(t);

Pour l'heure locale:

t = mktime(&tm);
...
tmp = localtime(t);

Tout ce que tzset() fait est de définir la variable de fuseau horaire interne à partir de la variable d'environnement TZ. Je ne pense pas que ce soit censé être appelé plus d'une fois.

Si vous essayez de convertir entre des fuseaux horaires, vous devez modifier le struct tm Du tm_gmtoff.

21
Rick C. Petty

Si sous Windows, vous ne disposez pas de timegm ():

struct tm *tptr;
time_t secs, local_secs, gmt_secs;
time( &secs );  // Current time in GMT
// Remember that localtime/gmtime overwrite same location
tptr = localtime( &secs );
local_secs = mktime( tptr );
tptr = gmtime( &secs );
gmt_secs = mktime( tptr );
long diff_secs = long(local_secs - gmt_secs);

ou quelque chose de similaire ...

17
Robert Cowham

Si vous devez vous soucier de la conversion de la date/heure avec des règles de fuseau horaire, vous voudrez peut-être examiner ICU .

2
chrish