Como criar um objeto datetime com reconhecimento de fuso horário em Python?

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

O que preciso fazer

Tenho um objeto datetime sem reconhecimento de fuso horário, ao qual preciso adicionar um fuso horário para poder compará-lo com outros objetos datetime com reconhecimento de fuso horário. Não quero converter todo o meu aplicativo para o fuso horário inconsciente para este caso legado.

O que tentei

Primeiro, para demonstrar o problema :

Python 2.6.1 (r261:67515, 24 de junho de 2010, 21:47:49) [GCC 4.2.1 (Apple Inc. build 5646)] no darwin Digite "help" , "direitos autorais", "créditos" ou "licença" para obter mais informações. ,15,8,15,12,0) >>> desconhece datetime.datetime(2011, 8, 15, 8, 15, 12) >>> ciente = datetime.datetime(2011,8, 15,8,15,12,0,pytz.UTC) >>> ciente datetime.datetime(2011, 8, 15, 8, 15, 12, tzinfo=<UTC>) >>> ciente == inconsciente Traceback (última chamada mais recente): Arquivo "<stdin>", linha 1, em <módulo> TypeError: não é possível comparar datas com reconhecimento de deslocamento ingênuo e deslocamento 

Primeiro, tentei astimezone:

>>> inconsciente.astimezone(pytz.UTC) Traceback (última chamada mais recente): Arquivo "<stdin>", linha 1, em <module> ValueError: astimezone() não pode ser aplicado a uma data e hora ingênua >>> 

Não é muito surpreendente que isso tenha falhado, pois na verdade está tentando fazer uma conversão. Substituir parecia uma escolha melhor (de acordo com Como obtenho um valor de datetime.today() em Python que seja "reconhecido pelo fuso horário"?):

>>> inconsciente.replace(tzinfo=pytz.UTC) datetime.datetime(2011, 8, 15, 8, 15, 12, tzinfo=<UTC>) >>> inconsciente == ciente Traceback (última chamada mais recente): Arquivo "<stdin>", linha 1, em <module> TypeError: não é possível comparar os datetimes offset-naive e offset-aware >>> 

Mas como você pode ver, replace parece definir o tzinfo, mas não torna o objeto ciente . Estou me preparando para voltar a modificar a string de entrada para ter um fuso horário antes de analisá-la (estou usando dateutil para analisar, se isso importa), mas isso parece incrivelmente desajeitado.

Além disso, Eu tentei isso no Python 2.6 e no Python 2.7, com os mesmos resultados.

Contexto

Estou escrevendo um analisador para alguns arquivos de dados. Existe um formato antigo que eu preciso suportar onde a string de data não possui um indicador de fuso horário. Já corrigi a fonte de dados, mas ainda preciso suportar o formato de dados legado. Uma conversão única dos dados legados não é uma opção por vários motivos de BS de negócios. Embora, em geral, não goste da ideia de -codificar um fuso horário padrão, neste caso parece ser a melhor opção. Eu sei com razoável confiança que todos os dados legados em questão estão em UTC, então estou preparado para aceitar o risco de não usar isso neste caso.