Comment créer un objet datetime sensible au fuseau horaire en Python ?

| | | | | | | | | | | | | | | | | | |

Ce que je dois faire

J'ai un objet datetime qui ne prend pas en compte le fuseau horaire, auquel je dois ajouter un fuseau horaire afin de pouvoir le comparer avec d'autres objets datetime sensibles au fuseau horaire. Je ne veux pas convertir l'intégralité de mon application en fuseau horaire ignorant pour ce cas hérité.

Ce que j'ai essayé

Tout d'abord, pour démontrer le problème :

Python 2.6.1 (r261:67515, 24 juin 2010, 21:47:49) [GCC 4.2.1 (Apple Inc. build 5646)] sur darwin Tapez "help" , "copyright", "crédits" ou "licence" pour plus d'informations. >>> import datetime >>> import pytz >>> unaware = datetime.datetime(2011,8 ,15,8,15,12,0) >>> pas au courant datetime.datetime(2011, 8, 15, 8, 15, 12) >>> conscient = datetime.datetime(2011,8, 15,8,15,12,0,pytz.UTC) >>> conscient datetime.datetime(2011, 8, 15, 8, 15, 12, tzinfo=<UTC>) >>> conscient == unaware Traceback (dernier appel le plus récent) : Fichier "<stdin>", ligne 1, dans <module> TypeError : impossible de comparer les dates/heures décalées et sensibles à l'offset 

D'abord, j'ai essayé astimezone :

>>> unaware.astimezone(pytz.UTC) Traceback (dernier appel le plus récent) : Fichier "<stdin>", ligne 1, dans <module> ValueError : astimezone() ne peut pas être appliqué à un datetime naïf >>> 

Il n'est pas très surprenant que cela ait échoué, car il essaie en fait de faire une conversion. Remplacer semblait être un meilleur choix (selon Comment puis-je obtenir une valeur de datetime.today() en Python qui est "conscient du fuseau horaire" ?) :

>>> unaware.replace(tzinfo=pytz.UTC) datetime.datetime(2011, 8, 15, 8, 15, 12, tzinfo=<UTC>) >>> unaware == conscient Traceback (appel le plus récent en dernier) : Fichier "<stdin>", ligne 1, dans <module> TypeError : impossible de comparer les dates/heures décalées et sensibles à l'offset >>> 

Mais comme vous pouvez le voir, le remplacement semble définir le tzinfo, mais pas rendre l'objet conscient . Je me prépare à revenir à la manipulation de la chaîne d'entrée pour avoir un fuseau horaire avant de l'analyser (j'utilise dateutil pour l'analyse, si cela compte), mais cela semble incroyablement maladroit.

Aussi, J'ai essayé cela dans Python 2.6 et Python 2.7, avec les mêmes résultats.

Contexte

J'écris un analyseur pour certains fichiers de données. Il y a un ancien format que je dois prendre en charge où la chaîne de date n'a pas d'indicateur de fuseau horaire. J"ai déjà corrigé la source de données, mais je dois toujours prendre en charge le format de données hérité. Une conversion unique des données héritées n"est pas une option pour diverses raisons commerciales. Alors qu"en général, je n"aime pas l"idée de dur -coder un fuseau horaire par défaut, dans ce cas, cela semble être la meilleure option. Je sais avec une confiance raisonnable que toutes les données héritées en question sont en UTC, donc je suis prêt à accepter le risque de le faire par défaut dans ce cas.