Comment un programme Windows peut-il modifier temporairement son fuseau horaire?

J’ai écrit une fonction pour renvoyer la valeur time_t correspondant à minuit un jour donné. Lorsqu’il n’y a pas de minuit pour un jour donné, il renvoie la première heure disponible; cette situation peut se produire, par exemple, lorsque l’Égypte entre dans l’heure d’été. Cette année, le changement d’heure entre en vigueur à minuit dans la nuit du 29 avril. Le temps passe donc directement de 23h59 à 01h00.

J’écris maintenant des tests unitaires pour cette fonction, et l’un des tests devrait reproduire le scénario égyptien. Dans Unix, je peux le faire comme ceci:

 putenv("TZ", "Egypt", true); tzset(); 

Après cela, d’autres appels à localtime se comportent comme s’ils étaient en Egypte au lieu du Minnesota, et mes tests réussissent. Le simple fait de définir la variable d’environnement n’a aucun effet sur Windows. Que puis-je faire pour que le test unitaire pense qu’il est ailleurs sans affecter le rest des programmes exécutés sur le système?

Utiliser le framework Isolation / Mocking – le seul que je connaisse pour le moment est Isolator ++ qui est actuellement en version bêta, je suis sûr que vous pouvez en obtenir une copie en en demandant une des bonnes personnes de Typemock.

Découvrez _putenv_s et _tzset . En théorie, vous devriez pouvoir définir la variable d’environnement TZ pour votre processus avec _putenv_s , puis utiliser _tzset pour définir le fuseau horaire local réel de votre processus sur la valeur de la variable d’environnement TZ .

Je sais que cela fonctionne sous Linux avec putenv et tzset , et à partir de la documentation de _putenv_s et _tzset , il semble que vous devriez pouvoir faire la même chose avec Windows. Je n’ai pas vraiment essayé cependant.

N’appelez pas SetTimeZoneInformation – il n’y a pas de notion de fuseau horaire ou de processus spécifique à un fuseau horaire dans Windows. Comme d’autres disent, le plus simple est de simuler le code du fuseau horaire – avec Pex / Mocks, vous pouvez simuler des méthodes statiques, ce qui signifie que vous pouvez accrocher le code standard du fuseau horaire .NET pour le remplacer par le vôtre. Si vous utilisez C / C ++, il vous suffit de câbler le code pour que les informations TZ soient modifiables.

Avec VS 2008 (C ++ native), j’ai pu modifier le comportement de localtime() en modifiant la variable _timezone .

Je suis d’accord, ce n’est pas une manière propre de faire, mais au moins cela pourrait être une solution de contournement.

Bien sûr, vous devez faire le calcul par vous-même pour trouver le nombre de secondes entre l’UTC et votre «nouveau» fuseau horaire.

J’ai utilisé setlocale(LC_ALL, "deu_aut") pour changer les parameters de langue / pays en Ausortingche – déclaré en locale.h . Malheureusement, je n’ai pas trouvé de chaîne de langue / pays pour l’Egypte, mais cela vous donne peut-être un indice.

J’ai exactement la même exigence:

-> certains processus doivent être liés à UTC et d’autres à certains fuseaux horaires différents du fuseau horaire de Windows

Après des mois d’étude ( interrompue ), je suis arrivé à la conclusion que sous Windows, il est uniquement possible de définir le fuseau horaire du système “UTC” ou “actuel”. Donc, seules les opérations suivantes peuvent être effectuées:

      - définir TZ = "UTC" 
      - Désactivé TZ

Installez un hook sur GetTimeZoneInformation, qui remplace les données système avec vos propres préférences.

Avez-vous vu la fonction SetTimeZoneInformation Win32 API?