Comment faire un pas au courant datetime fuseau horaire courant en python

Ce que je dois faire

J'ai un fuseau horaire n'est pas au courant objet datetime, pour lequel j'ai besoin d'ajouter un fuseau horaire afin d'être en mesure de le comparer avec d'autres fuseau horaire-conscient datetime objets. Je ne veux pas convertir la totalité de mon application à ignorer le fuseau horaire pour ce un héritage de cas.

Ce que j'ai Essayé

Tout d'abord, pour illustrer le problème:

Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import datetime
>>> import pytz
>>> unaware = datetime.datetime(2011,8,15,8,15,12,0)
>>> unaware
datetime.datetime(2011, 8, 15, 8, 15, 12)
>>> aware = datetime.datetime(2011,8,15,8,15,12,0,pytz.UTC)
>>> aware
datetime.datetime(2011, 8, 15, 8, 15, 12, tzinfo=<UTC>)
>>> aware == unaware
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't compare offset-naive and offset-aware datetimes

Tout d'abord, j'ai essayé astimezone:

>>> unaware.astimezone(pytz.UTC)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: astimezone() cannot be applied to a naive datetime
>>>

Il n'est pas très surprenant, cela a échoué, car c'est en fait essayer de faire une conversion. Remplacer semblait être un meilleur choix (comme par Python: Comment faire pour obtenir une valeur de type datetime.aujourd'hui() qui est "timezone conscient"?):

>>> unaware.replace(tzinfo=pytz.UTC)
datetime.datetime(2011, 8, 15, 8, 15, 12, tzinfo=<UTC>)
>>> unaware == aware
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't compare offset-naive and offset-aware datetimes
>>> 

Mais comme vous pouvez le voir, remplacez semble définir la tzinfo, mais de ne pas faire l'objet courant. Je suis prêt à tomber en arrière en raclant la chaîne d'entrée pour avoir un fuseau horaire avant l'analyse (je suis en utilisant dateutil pour l'analyse, si ce qui compte), mais qui semble incroyablement encombrants.

Aussi, j'ai essayé cette fois de la version 2.6 de python et python 2.7, avec les mêmes résultats.

Contexte

Je suis en train d'écrire un analyseur syntaxique pour certains fichiers de données. Il y a un vieux format que j'ai besoin de soutien, où la date chaîne de ne pas avoir un fuseau horaire indicateur. J'ai déjà corrigé la source de données, mais j'ai encore besoin à l'appui de l'héritage de format de données. Un temps de conversion de l'héritage de données n'est pas une option pour diverses affaires BS raisons. Bien qu'en général, je n'aime pas l'idée de coder en dur un fuseau horaire par défaut, dans ce cas, il semble que la meilleure option. Je sais avec une certitude raisonnable que tous les anciens de données en question est en UTC, donc je suis prêt à accepter le risque de défaut dans ce cas.

  • unaware.replace() serait de retour None si c'était la modification de unaware objet en place. Le REPL montre que .replace() retourne une nouvelle datetime objet ici.
  • Ce que j'ai besoin quand je suis venu ici: import datetime; datetime.datetime.now(datetime.timezone.utc)
  • Je voudrais utiliser le nommé tz arg pour être plus lisible: datetime.datetime.now(tz=datetime.timezone.utc)
InformationsquelleAutor Mark Tozzi | 2011-08-15