J'ai besoin de convertir du temps entre les fuseaux horaires en C (sur Linux, de sorte que quelque chose de particulier ferait aussi). P>
Je connais mon heure actuelle, locale et UTC, j'ai le décalage de l'heure cible. J'essaie d'utiliser mktime, gmtime, localtime et un ensemble de fonctions similaire, mais je ne peux toujours pas le comprendre. P>
Merci d'avance. P>
3 Réponses :
Dans toutes les probabilités, votre système d'exploitation fournit un soutien à cela. P>
Dans UNIX dérivé OOSS, vous voudrez peut-être regarder les pages de l'homme pour ASCTITime, ASCTime_R, CTime, CTTime_R, Dupftile, GMTime, GMTime_R, Localtime, localTime_R, MKTime, TimegM P>. P>.
Les API POSIX que vous mentionnez ne proposent pas vraiment de manière évidente de faire quelle question la question pose. Les questions mentions déjà certaines de ces fonctions par nom, en les mentionnant ainsi à nouveau et pointant sur les pages de l'homme, fondamentalement, n'est probablement pas une réponse utile.
Vous pouvez utiliser gmtime () et la structure TM pour définir directement ceci, à condition que vous connaissez les décalages.
Si vous connaissez votre heure locale et UTC, vous connaissez votre compensation locale. À condition que vous connaissiez également le décalage de la cible, il suffit de définir TM_HOUR appropriée (et de basculer potentiellement la journée, si vous allez <0 ou> 23). P>
pour certains échantillons de code, voir ceci < Un href = "http://www.cplusplus.com/reference/clibrary/ctime/gmtime/" rel = "nOfollow noreferrer"> page de référence GMTime . Il affiche une compensation de compensation basée sur des décalages de fuseau horaire. P>
EDIT: P>
En réponse aux commentaires - Vous pouvez également laisser mktime gérer le déplacement pour vous, ce qui vous permet de simplifier cela en convertissant à un temps_t. Vous pouvez utiliser quelque chose comme: p>
FWIW, non seulement TM_HOUR - E.G. L'heure standard de l'Inde (IST) est UTC + 5.5
Oui c'est vrai. Vous devriez potentiellement manipuler presque n'importe lequel des champs, mais le concept est sonore.
En fait, je pense qu'il y a un moyen d'éviter de faire trop d'arithmétiques manuellement ... puisque les commentaires n'autorisent pas le code, je le posterai comme une autre réponse.
hmm .. j'ai lu les pages de référence sur Mktime, ce qui dit que si je modifie la structure TM, je peux utiliser MKTime pour normaliser l'heure. Donc, cela s'occupera de normaliser les dates et tout autrement pourrait être compliqué. Je souhaiterais peut-être ensuite convertir ce temps à la structure TM (je ne sais pas si je devrais utiliser localTime ou gmtime) afin que je puisse utiliser des fonctions telles que Strftime, etc. pour obtenir des valeurs de temps formatées.
Comme les commentaires n'autorisent pas l'affichage du code, l'affichage de la réponse séparée. Si vous connaissez l'heure "locale" et "UTC", vous pouvez calculer le décalage de l'heure "Autre" de votre temps "local". Ensuite, vous convertissez la structure TM en temps de calendrier, ajoutez le nombre de secondes souhaité (étant le décalage de l'heure cible) et le reconvertiez-le à la structure TM:
(modifié pour compte pour un autre scénario pour utiliser la normalisation de Mktime) < / p>
Cela semble fonctionner bien. Je vais utiliser local_tm-> tm_sec + = 3600; autre_t = mktime (local_tm); Au lieu de cela et laissez mktime faire toutes les choses de normalisation pour moi.
Oui, cela devrait également fonctionner - j'essayais d'être poli et d'éviter d'écrire sur la mémoire de quelqu'un d'autre, car la mémoire pointée par local_tm dans cet exemple n'appartient pas à mon code.
Quoi qu'il en soit, l'autonormalisation est une bonne chose, j'ai également modifié l'exemple avec votre utilisation. Je pensais que l'heure «époque» dans ce scénario sera synthétique une fois que vous ajoutez le delta entre autres fois et votre temps, donc je l'ai également renommé en conséquence.
Cela suppose que nous connaissons le delta entre le courant et l'autre. Ou UCT et d'autres fonctionneraient aussi. Mais ce delta n'est pas nécessairement une constante sur l'année (DST commençant / se terminant dans divers pays ou même des modifications aux règles de conversion locale pour une zone particulière). Y a-t-il un Général i> moyen de convertir de la zone A à la zone B pour une valeur d'époque Unix arbitraire?
Je pense que vous pouvez définir la variable d'environnement "TZ" puis utiliser Tzset pour "prétendre" que votre heure locale est soit dans la zone A ou la zone B. C'est la seule approche plus ou moins "générique" que je penserais.
@John m: J'ai décidé de poster votre demande comme une question distincte, ainsi que de certains échantillons de code - peut-être qu'il y a de meilleurs moyens de le faire.