7
votes

LocalTime retourne GMT pour les programmes Windows exécutés sur des coquilles Cygwin

Considérez le code suivant:

 struct tm timestr;
 makeATMFromAStringForExample( time, timestr );
 time_t timet = mktime( &timestr );
 timet += localTimeOffset;


0 commentaires

3 Réponses :


11
votes

Cela m'a pris du temps pour comprendre, et j'espère que cela sera utile aux autres.

Posix Fonctions comme localTime utilisera la variable d'environnement tz Déterminer quel fuseau horaire à utiliser. Si tz n'est pas défini, il utilisera le fuseau horaire par défaut du système.

si je cours sous Linux ou OS X, tz est réglé correctement et tout fonctionne . Si j'exécute ce programme dans la coquille sous Windows, tz n'est pas défini, la fonction renvoie la fuseau horaire par défaut du système d'exploitation, qui produit à nouveau des résultats corrects.

Si j'exécute Une coquille Cygwin, TZ est définie - mais puisque j'ai construit le programme à l'aide de MSVC, à l'aide de la propre bibliothèque STDC de MSVC - il ne peut pas interpréter la variable TZ de Cygwin. Donc, il est par défaut à GMT.

Si le programme a été construit avec GCC sous Cygwin, je parie qu'elle fonctionnerait correctement dans les coquilles Cygwin.

Donc, la réponse est donc de s'assurer que les programmes qui appellent POSIX Time Fonctions telles que localTime () , si vous souhaitez que les fonctions temporelles fonctionnent à droite sous les coquilles de Cygwin, vous devez non définir TZ .

Je l'ai fait Comme: xxx


3 commentaires

putenv ("tz =") ne compte pas vraiment TZ; Il la définit à la chaîne vide. Je ne sais pas si cela importe, mais vous pouvez essayer d'utiliser nonsetenv ("tz") à la place.


Merci pour cela. Je l'ai regardé. Windows n'a pas de ouenv. Pour non définissez une variable, vous le définissez sur la chaîne vide avec Putenv.


Sous Cygwin, il suffit de gérer "non défini"



0
votes

Essayez de définir le drapeau TM_ISDST dans une structure TM.

Le drapeau de l'heure d'été (TM_ISDST) est supérieur à zéro si le temps d'économie de jour est en vigueur, zéro si l'heure d'économie de jour n'est pas en vigueur, et moins de zéro si les informations ne sont pas disponibles.

Si je me souviens bien, sous Windows, il doit être de -1 pour fonctionner correctement.


2 commentaires

DST n'expliquerait pas une différence de 5 heures.


Ouch .. Désolé, tu as absolument raison. Je n'ai pas vu cette différence de 5 heures. La chose est que j'avais un problème similaire avec Linux / Windows et je l'ai résolu correctement dans la définition de la DST.



1
votes

Utiliser exporter tz = "" dans la coque Cygwin peut être le meilleur moyen.

@Update
Salut, Tunaki. Merci votre édition!


0 commentaires