La conversion Entre l'heure Locale et l'heure GMT/UTC en C/C++
Quel est le meilleur moyen de convertir des datetimes entre l'heure locale et l'heure UTC en C/C++?
Par "datetime", je veux dire des temps de représentation qui contient la date et l'heure de la journée. Je vais être heureux avec time_t
, struct tm
, ou toute autre représentation qui la rend possible.
De ma plate-forme 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 en GMT. J'ai besoin de convertir un locale-fuseau horaire "AAAAMMJJHHMMSS" de la valeur. Je sais comment faire pour convertir la date julienne de Y-M-D, et évidemment, il est facile de convertir des secondes en HHMMSS. Cependant, la partie la plus délicate est le fuseau horaire de conversion. Je suis sûr que je peux trouver une solution, mais je préfère trouver un "standard" ou "bien connu" façon plutôt que d'achoppement autour de.
D'une question connexe est de savoir Obtenez de l'heure d'été Dates de Transition Pour les fuseaux Horaires en C
Vous devez vous connecter pour publier un commentaire.
Que vous êtes supposé utiliser des combinaisons de
gmtime
/localtime
ettimegm
/mktime
. Cela devrait vous donner la orthogonale outils pour faire des conversions entrestruct tm
ettime_t
.UTC/GMT:
Pour localtime:
Tous
tzset()
n'est fixé à l'intérieur du fuseau horaire variable de laTZ
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
'stm_gmtoff
.tm_gmtoff
maintenant, et la liste est assez courte), mais: Pourriez-vous peut-être donner un exemple de modification de tm_gmtoff et avoir que faire quelque chose d'utile? Il ne semble pas modifier la sortie de l'e.g,strftime(buf, BUFSIZ, "%FT%T%z (%+ %z)", tm);
, quand je le fais. ??timegm
est un non-standard GNU/BSD extension et n'est pas disponible sur Windows, etc. Le Linux page de man pourtimegm
montre un portable approche basée sur le changement deTZ
dans l'environnement. Malheureusement, cela n'est pas immédiatement portable pour Windows, en raison de son manque desetenv
._mkgmtime(&tm);
, il interprète lestruct tm
être en UTC, plutôt que dans votre TZ.Si sur Windows, vous n'avez pas timegm() s'offrent à vous:
ou quelque chose de similaire...
secs
etgmt_secs
être identiques? Je pense que vous pourriez simplifier un peu les choses.Si vous avez besoin de s'inquiéter à propos de la conversion de la date/l'heure avec le fuseau horaire règles, vous voudrez peut-être regarder dans ICU.