Conversion entre L'heure locale et GMT / UTC en C/C++

Quelle est la meilleure façon de convertir les datetimes entre l'heure locale et UTC en c/" class="blnk">C/C++?

par" datetime", je veux dire une représentation du temps qui contient la date et l'Heure de la journée. Je me contenterai de time_t , struct tm , ou de toute autre représentation qui le rend possible.

ma plate-forme est Linux.

Voici le problème que j'essaie de résoudre: - je obtenir une paire de valeurs contenant une date julienne et un certain nombre de secondes dans la journée. Ces valeurs sont exprimées en GMT. J'ai besoin de convertir ça en une valeur de "YYYMMDDHHMMSS". Je sais comment convertir la date julienne en Y-M-D, et évidemment il est facile de convertir 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ère trouver un "standard" ou "bien connu" plutôt que titubant.


une question peut-être liée est obtenir les Dates de Transition D'économie D'énergie pour les fuseaux horaires dans C

28
demandé sur Kristopher Johnson 2009-04-17 23:11:43

3 réponses

vous êtes censé utiliser des combinaisons de gmtime / localtime et timegm / mktime . Cela devrait vous donner les outils orthogonaux pour faire 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 localtime:

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

Tous tzset() n'est défini à l'intérieur du fuseau horaire variable à partir de la TZ variable d'environnement. Je ne pense pas que ce est censé être appelé plus d'une fois.

si vous essayez de convertir entre les fuseaux horaires, vous devez modifier le struct tm 's tm_gmtoff .

21
répondu Rick C. Petty 2009-04-17 19:17:07

si sur Windows, vous n'avez pas timegm() disponible pour vous:

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
répondu Robert Cowham 2009-06-24 16:12:44

si vous devez vous soucier de convertir la date/heure avec les règles de fuseau horaire, vous pourriez vouloir regarder dans ICU .

2
répondu chrish 2009-04-18 02:57:19