Estou tentando comparar a data e hora atuais com datas e horas especificadas nos modelos usando operadores de comparação:
if challenge.datetime_start <= datetime.now() <= challenge.datetime_end:
O script apresenta erros com:
TypeError: can't compare offset-naive and offset-aware datetimes
Os modelos são assim:
class Fundraising_Challenge(models.Model):
name = models.CharField(max_length=100)
datetime_start = models.DateTimeField()
datetime_end = models.DateTimeField()
Eu também tenho django usando data e hora da localidade.
O que não consegui encontrar é o formato que o django usa para DateTimeField (). É ingênuo ou consciente? E como faço para que o datetime.now () reconheça o datetime da localidade?
python
django
datetime
comparison
sccrthlt
fonte
fonte
Respostas:
Por padrão, o
datetime
objeto estánaive
em Python, portanto, você precisa tornar os doisdatetime
objetos ingênuos ou conscientes . Isso pode ser feito usando:Nota: Isso geraria um
ValueError
iftzinfo
já está definido. Se você não tiver certeza, basta usarBTW, você pode formatar um timestamp UNIX no objeto datetime.datetime com informações de fuso horário da seguinte maneira
fonte
tzinfo
não faz nenhuma conversão, tornando a comparação incorreta.utc = pytz.utc
para evitar o erro de pilãoNo value for argument 'dt' in unbound method call (no-value-for-parameter)
. pytz linkdatetime.datetime.now
não está ciente do fuso horário.O Django vem com um ajudante para isso, o que requer
pytz
Você deve poder comparar
now
comchallenge.datetime_start
fonte
USE_TZ=True
seguida,timezone.now()
retorna um objeto de data e hora com reconhecimento de fuso horário, mesmo quepytz
não esteja instalado (embora seja recomendável instalar por outros motivos).Solução de uma linha de código
Versão explicada
Resumo
Você deve adicionar as informações do fuso horário à sua
now()
data e hora.No entanto, você deve adicionar o mesmo fuso horário da variável de referência; é por isso que li o
tzinfo
atributo pela primeira vez .fonte
Desativar fuso horário. Usar
challenge.datetime_start.replace(tzinfo=None);
Você também pode usar
replace(tzinfo=None)
para outra data e hora .fonte
Portanto, a maneira como eu resolveria esse problema é garantir que as duas datas estejam no fuso horário certo.
Percebo que você está usando o
datetime.now()
que retornará a hora atual do sistema, sem o tzinfo definido.tzinfo é a informação anexada a um datetime para informá-lo em que fuso horário está. Se você estiver usando um datetime ingênuo, precisará ser consistente em todo o sistema. Eu recomendo apenas usar
datetime.utcnow()
Como em algum lugar em que você está criando data e hora que o tzinfo está associado a elas, o que você precisa fazer é garantir que elas estejam localizadas (tem o tzinfo associado) no fuso horário correto.
Dê uma olhada no Delorean , isso facilita muito o tratamento desse tipo de coisa.
fonte
Está funcionando de mim. Aqui eu estou geeting a tabela criada datetime e adicionando 10 minutos no datetime. posteriormente, dependendo da hora atual, as Operações de expiração são concluídas.
Adicionados 10 minutos no datetime do banco de dados
table_datetime = '2019-06-13 07: 49: 02.832969' (exemplo)
Funcionou para mim.
fonte
Somente:
Então faça o seguinte:
e depois use
start_time
eend_time
fonte