11
votes

Faire réagir à Python aux modifications de Windows Timezone

Lorsque Python fonctionne sous Windows, Time.LocalTime ne signalent pas le temps correct si le fuseau horaire est modifié pendant la durée de vie de l'instance Python. Sous Linux, Time.Tzset peut toujours être exécuté pour atténuer des problèmes comme celui-ci, mais il semble y avoir d'équivalent dans Windows.

Y a-t-il un moyen de résoudre ce problème sans faire quelque chose d'absurde, Oh, je ne sais pas. .. xxx


2 commentaires

Je peux confirmer cela, ressemble à un bug pour moi.


@Rafe pourquoi l'EVAL ne serait-il pas nécessaire? Je veux un tuple avec lequel je peux travailler, pas une chaîne.


3 Réponses :


4
votes

Non, cela ne peut pas être corrigé sans faire ce que vous avez fait. C'est un peu absurde, mais si vous avez besoin du bon fuseau horaire sous Windows et qu'il a changé au cours de l'exécution du programme, cela doit être fait.

Ce n'est probablement pas un bogue (la documentation est très claire que la fonction tzset () est uniquement disponible sur UNIX). Il est plus probable qu'une faiblesse de Windows empêche les programmeurs Python de mettre en œuvre tzset () sous celui-ci. Vous pouvez faire une demande d'amélioration de la fonctionnalité, mais cela a été ainsi depuis Python 2.3 (7 ans), il est donc improbable qu'il soit réellement mis en œuvre.


3 commentaires

Une demande de fonctionnalité ne me ferait pas beaucoup de bien personnellement depuis que j'utilise toujours 2.x, mais je suppose que je pouvais épargner quelqu'un le enfer plus tard. Existe-t-il un moyen d'obtenir la fonction de recharge pour fonctionner sur un modules intégrés? J'ai essayé "DEL TIME; DEL SYS.MODULES ['TIME']" N'acceptez pas de bonne chance lorsque la fonction de rechargement ancienne ordinaire n'a pas fonctionné.


@Ericpruit n'est probablement pas si vous essayiez la voie «normale» de recharger. Votre solution est un peu d'un kludge mais ça devra travailler


Je pense que je vais utiliser CTTPES ou PYWIN32 et essayer d'utiliser Kernel32.Lib's GetLocalTime .



6
votes

Une solution plus rationnelle est d'utiliser Kernel32's GetLocalTime avec pywin32 ou CTTYPES. Tout changement de fuseau horaire est immédiatement reflété.

import ctypes
class SYSTEMTIME(ctypes.Structure):
    _fields_ = [
        ('wYear', ctypes.c_int16),
        ('wMonth', ctypes.c_int16),
        ('wDayOfWeek', ctypes.c_int16),
        ('wDay', ctypes.c_int16),
        ('wHour', ctypes.c_int16),
        ('wMinute', ctypes.c_int16),
        ('wSecond', ctypes.c_int16),
        ('wMilliseconds', ctypes.c_int16)]

SystemTime = SYSTEMTIME()
lpSystemTime = ctypes.pointer(SystemTime)
ctypes.windll.kernel32.GetLocalTime(lpSystemTime)
print SystemTime.wHour, SystemTime.wMinute 


0 commentaires

4
votes

La ligne finale est qu'avec VC Ver 6, TzSet () ne fonctionne pas correctement. Cependant, avec VC Ver 8 Tzset () fonctionne maintenant (je pense que cela fonctionnera également dans Ver 7, mais je n'ai pas cette version à vérifier).

Donc, tout ce qui doit se passer maintenant est de Activer avoir_working_tzset b> dans le code source et re-compiler (et testez). p>

dans mon expérience, tous les besoins des fonctions pour différents paramètres de TZ doivent avoir un tzset de travail (). Vous devez appeler TzSet () à tout moment que vous modifiez C Lang TZ Var -Or-Windows Time_Zone_Information. Ce n'était pas possible dans VC Ver 6 et c'est pourquoi le working_tzset n'est pas activé (mais devrait maintenant être pour au moins VC Ver 8 et UP). P>

BTW. Pour tous les trucs de date / heure, je le fais, j'ai toujours une définition () et une non -tuctime () qui définit TZ sur GMT et appelle tzset () en conséquence. J'ai aussi des fonctions à TEMP réglé sur un autre fuseau horaire aussi. C'est la seule façon de le faire correctement! Dans de nombreuses années d'expérience, je peux dire que toute autre chose est des problèmes. Et calendar.timegm () n'est pas correct. Utilisez tzset (). P>

Voici la preuve, il fonctionne maintenant (alors allez à Bug Author pour corriger le code Windows): P>

(J'ai saisi ceci d'une autre orthographe. erreurs, mais c'est le Pointe que je fais, pas le code). P>


Remarque: Tout en dessous est Python (j'appelle C Lang de l'interface CTYPE de Python) Remarque: parce que je me contente de TZ via la limite DLL ici et du fil local et de tous Cette merde, il ne peut pas être utilisé comme un travail autour. Doit réactiver avoir_working_tzset. P> xxx pré>

-> ... 21:02:40 ... (python)
-> ... 21:02:40 ... (C lang) p> xxx pré>

(normalement temps.tzset () serait appelé et appelant également inittimezone () à mettre à jour Variables TimeZone de Python aussi) P>

print time.ctime (dTime)
print c_char_p (cdll.msvcrt.ctime (addressof (intTime))).value


0 commentaires