Django Wars [Parte 21]: can’t subtract offset-naive and offset-aware datetimes

O Django Wars foi idealizado e desenvolvido no Django 1.4. Algumas funcionalidades aqui descritas podem não funcionar ou funcionar de forma diferente em outras versões do Django

Vish!!!!
Fez o passo-a-passo do post anterior e o Django deu pau:
can’t subtract offset-naive and offset-aware datetimes
E agora???

O que acontece é o seguinte:
você está tentando fazer um cálculo entre dois objetos datetime.
A bronca é que um destes objetos tem o timezone setado e o outro não.
Assim, o Python não sabe como proceder e PAAAUUUUUU!!!!

No nosso caso, o arquivo settings.py tem a diretiva USE_TZ marcado como True.
Isso significa dizer que o Django, quando salva qualquer coisa relacionada com o tempo, como um campo DateTimefield, ao invés de usar a hora do servidor, está detectando o TIME ZONE do usuário e salvando a hora do computador do usuário.

No caso desse erro, a coisa mais fácil de se fazer é ir no arquivo settings.py e alterar a variável USE_TZ para False.

E ai, tudo vai funcionar beleza!

Onde está o código-fonte do projeto?
Não falo, RÁÁÁÁÁÁÁÁÁÁÁ!!!!!

4 thoughts on “Django Wars [Parte 21]: can’t subtract offset-naive and offset-aware datetimes

  1. Qual o que não tem timezone?

    agora = datetime.datetime.now() ???

    Se sim, não tem como passar o timezone como parâmetro pra função não?

    Olha o que eu descobri como solução:

    (caso para quem não tem setuptools como eu)

    1- baixe a biblioteca pytz
    http://sourceforge.net/projects/pytz/

    2- instale a biblioteca usando o console:
    python setup.py install

    3- no modulo onde está a função refresh, importe pytz:

    import pytz

    4- mude o código para:

    agora = datetime.datetime.now(pytz.utc)

    Pronto! Com isso não precisa mudar o USE_TZ em settings para False. Não sei no que isso implica…

    1. Essa é a segunda opção.
      Como eu disse no post, eu escolhi a coisa mais fácil a se fazer, que era desligar o TimeZone do Django.

      Também, desligar o TZ não impacta tanto no nosso projeto.
      Só estamos utilizando o datetime para calcular o refresh do usuário.
      Tanto faz se a hora que está no banco de dados é a hora do servidor ou a hora local do jogador, o que importa é que tenha uma hora lá que possamos utilizar para fazer comparação de tempo.

      Essa sua opção funciona perfeitamente.
      Fiquei pensando em implementá-la.
      Decidi por não implementar só para prender o projeto nas bibliotecas Python e Django, sem precisar de bibliotecas externas.
      Pode ser que depois do fim do projeto eu faça uns apêndices e coloque lá a sua dica 😀

  2. O que está fazendo simplesmente é setar o timezone naquela data que antes não tinha ao invés de tirar o timezone da data que tem. 😀

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *