Estoy tratando de comparar la fecha y hora actual con las fechas y horas especificadas en los modelos que utilizan operadores de comparación:
if challenge.datetime_start <= datetime.now() <= challenge.datetime_end:
Los errores de script con:
TypeError: can't compare offset-naive and offset-aware datetimes
Los modelos se ven así:
class Fundraising_Challenge(models.Model):
name = models.CharField(max_length=100)
datetime_start = models.DateTimeField()
datetime_end = models.DateTimeField()
También tengo django usando la fecha y hora locales.
Lo que no he podido encontrar es el formato que usa django para DateTimeField (). ¿Es ingenuo o consciente? ¿Y cómo obtengo datetime.now () para reconocer la fecha y hora local?
python
django
datetime
comparison
sccrthlt
fuente
fuente
Respuestas:
Por defecto, el
datetime
objeto estánaive
en Python, por lo que debe hacer que ambos seandatetime
objetos ingenuos o conscientes . Esto se puede hacer usando:Nota: Esto generaría un
ValueError
if sitzinfo
ya está configurado. Si no está seguro de eso, simplemente usePor cierto, podría formatear una marca de tiempo UNIX en el objeto datetime.datetime con información de zona horaria de la siguiente manera
fuente
tzinfo
no hace ninguna conversión, haciendo que la comparación sea incorrecta.utc = pytz.utc
para evitar el error de pylintNo value for argument 'dt' in unbound method call (no-value-for-parameter)
. enlace pytzdatetime.datetime.now
no es consciente de la zona horaria.Django viene con un ayudante para esto, que requiere
pytz
Deberías poder comparar
now
conchallenge.datetime_start
fuente
USE_TZ=True
luegotimezone.now()
devuelve un objeto de fecha y hora con reconocimiento de zona horaria, incluso sipytz
no está instalado (aunque podría recomendarse instalarlo por otros motivos).Una línea de solución de código
Versión explicada
Resumen
Debe agregar la información de la zona horaria a su
now()
fecha y hora.Sin embargo, debe agregar la misma zona horaria de la variable de referencia; Es por eso que primero leí el
tzinfo
atributo.fuente
Deshabilitar zona horaria. Utilizar
challenge.datetime_start.replace(tzinfo=None);
También puede usar
replace(tzinfo=None)
para otra fecha y hora .fuente
Entonces, la forma en que resolvería este problema es asegurándome de que las dos fechas y horas estén en la zona horaria correcta.
Puedo ver que está utilizando
datetime.now()
lo que devolverá la hora actual del sistema, sin tzinfo configurado.tzinfo es la información adjunta a una fecha y hora para hacerle saber en qué zona horaria se encuentra. Si está utilizando una fecha y hora ingenua, debe ser coherente en todo el sistema. Recomiendo encarecidamente solo usar
datetime.utcnow()
ya que estás creando un datetime que tiene tzinfo asociado con ellos, lo que debes hacer es asegurarte de que estén localizados (tiene tzinfo asociado) en la zona horaria correcta.
Eche un vistazo a Delorean , hace que lidiar con este tipo de cosas sea mucho más fácil.
fuente
Está trabajando de mí. Aquí estoy obteniendo la tabla de fecha y hora creada y agregando 10 minutos en la fecha y hora. más tarde, dependiendo de la hora actual, se realizan operaciones de vencimiento.
Se agregaron 10 minutos en la fecha y hora de la base de datos
table_datetime = '2019-06-13 07: 49: 02.832969' (ejemplo)
Funcionó para mi.
fuente
Sólo:
Entonces haz esto:
y luego usar
start_time
yend_time
fuente