O que eu preciso fazer
Eu tenho um objeto de data e hora sem reconhecimento de fuso horário, ao qual preciso adicionar um fuso horário para poder compará-lo com outros objetos de data e hora com reconhecimento de fuso horário. Não quero converter todo o meu aplicativo em fuso horário sem conhecer este caso legado.
O que eu tentei
Primeiro, para demonstrar o problema:
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
Primeiro, tentei o 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
>>>
Não é de surpreender que isso tenha falhado, pois está realmente tentando fazer uma conversão. Substituir parecia uma escolha melhor (como em Python: como obter um valor de datetime.today () que é "consciente do fuso horário"? ):
>>> 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
>>>
Mas, como você pode ver, substituir parece definir o tzinfo, mas não conscientiza o objeto. Estou me preparando para voltar a medicar a string de entrada para ter um fuso horário antes de analisá-la (estou usando o dateutil para análise, se isso importa), mas isso parece incrivelmente desagradável.
Além disso, eu tentei isso no python 2.6 e python 2.7, com os mesmos resultados.
Contexto
Estou escrevendo um analisador para alguns arquivos de dados. Há um formato antigo que preciso oferecer suporte onde a sequência de datas não possui um indicador de fuso horário. Eu já corrigi a fonte de dados, mas ainda preciso oferecer suporte ao formato de dados herdado. Uma conversão única dos dados herdados não é uma opção por vários motivos de negócios da BS. Embora, em geral, eu não goste da ideia de codificar um fuso horário padrão, neste caso, parece a melhor opção. Sei com confiança razoável que todos os dados herdados em questão estão no UTC, portanto, estou preparado para aceitar o risco de não cumprir isso neste caso.
import datetime; datetime.datetime.now(datetime.timezone.utc)
tz
argumento arg para ser mais legível:datetime.datetime.now(tz=datetime.timezone.utc)
unaware.replace()
retornariaNone
se estivesse modificando ounaware
objeto no local. O REPL mostra que.replace()
retorna um novodatetime
objeto aqui.