2012-01-11 2 views
2

J'ai une configuration fonctionnant en utilisant localtime() pour obtenir un tm avec les heures locales qui y sont représentées. Et c'est tout bon.C++ localtime lors du changement de fuseau horaire

Cependant, si je change de fuseau horaire alors que l'application est en cours d'exécution, elle ne remarque pas que j'ai changé de fuseau horaire.

Existe-t-il un moyen de dire «aller chercher à nouveau» pour actualiser le fuseau horaire du système?

Je sais que ce n'est probablement pas un cas courant, mais c'est ce que font les tests pour tester cette fonctionnalité, donc ils veulent la prendre en charge!

Répondre

1

Il n'y a rien dans la bibliothèque standard pour cela. À moins que votre plate-forme n'offre une extension à la bibliothèque pour la mise à jour du fuseau horaire, les appels de votre programme au localtime() utiliseront probablement toujours le fuseau horaire qui était actif au démarrage du programme.

Vous pourriez probablement contourner cela en mettant le localtime dans un processus séparé que votre programme principal peut démarrer et arrêter à volonté, réinitialisant ainsi le fuseau horaire de ce processus. À la place, votre plate-forme peut offrir une autre API pour obtenir l'heure locale qui reflétera les changements dans le fuseau horaire du système.

+0

Je craignais (ou peut-être espérais!) Ce serait quelque chose comme ça. Nous avons l'espoir d'être cross plate-forme plus tard, donc la solution Posix n'est pas bonne.Devra aller avec une documentation 'si vous changez de fuseau horaire, redémarrez le service' solution. – Jon

1

Jetez un coup d'oeil à tzset (ceci est posix seulement). Cela pourrait vous donner ce dont vous avez besoin. Si votre variable d'environnement TZ n'est pas définie, elle doit être réinitialisée à partir du système d'exploitation.

De la page man:

DESCRIPTION

La fonction tzset() initialise tzname de la variable d'environnement TZ. Cette fonction est automatiquement appelée par les autres fonctions de conversion qui dépendent du fuseau horaire. Dans un environnement semblable à SysV , les variables (secondes à l'ouest de GMT) et la lumière du jour (0 si ce fuseau horaire n'a pas ont des règles d'heure d'été, non nulles s'il y a un temps pendant la année où l'heure avancée s'applique).

Si la variable TZ ne figure pas dans l'environnement, tzname est initialisé avec la meilleure approximation du temps d'horloge murale locale, comme spécifié par le tzfile (5) fichier -format localtime trouvé dans le répertoire système des fuseaux horaires (voir ci-dessous). (On aussi souvent voit/etc/localtime ici, un lien symbolique vers le bon fichier dans le répertoire système des fuseaux horaires .)

Un simple test:

#include <iostream> 
#include <time.h> 
#include <stdlib.h> 

int main() 
{ 
     tzset(); 

     time_t t; 
     time(&t); 

     std::cout << "tz: " << tzname[0] << " - " << tzname[1] << " " << ctime(&t) << std::endl; 

     setenv("TZ", "EST5EDT", 1); 
     tzset(); 

     std::cout << "tz: " << tzname[0] << " - " << tzname[1] << " " << ctime(&t) << std::endl; 

     return 0; 
} 

me donne la sortie:

tz: CST - CDT Mer Jan 11 12:35:02 2012

tz: EST - HAE Mer 11 janvier 2012 13:35:02

+0

Malheureusement, nous espérons être multi-plateforme, donc la solution posix ne va pas le couper. Mais merci! – Jon

Questions connexes