267 votes

Ne peut pas comparer datetime.now() naive et aware <= challenge.datetime_end

Je tente de comparer la date et l'heure actuelles avec les dates et heures spécifiées dans les modèles en utilisant des opérateurs de comparaison :

if challenge.datetime_start <= datetime.now() <= challenge.datetime_end:

Le script retourne une erreur :

TypeError: can't compare offset-naive and offset-aware datetimes

Les modèles ressemblent à ceci :

class Fundraising_Challenge(models.Model):
    name = models.CharField(max_length=100)
    datetime_start = models.DateTimeField()
    datetime_end = models.DateTimeField()

J'utilise également django avec des dates et heures locales.

Ce que je n'ai pas réussi à trouver, c'est le format que django utilise pour DateTimeField(). Est-il naïf ou conscient? Et comment puis-je faire en sorte que datetime.now() reconnaisse la date et l'heure locales?

3voto

Chandan Sharma Points 1420

Cela fonctionne pour moi. Ici, je récupère la date de création de la table et j'ajoute 10 minutes à la date. Plus tard, en fonction de l'heure actuelle, les opérations d'expiration sont effectuées.

de datetime import datetime, time, timedelta
import pytz

Ajout de 10 minutes sur la date et l'heure de la base de données

table_datetime = '2019-06-13 07:49:02.832969' (exemple)

# Ajout de 10 minutes sur la date et l'heure de la base de données
# table_datetime = '2019-06-13 07:49:02.832969' (exemple)

table_expire_datetime = table_datetime + timedelta(minutes=10)

# Date et heure actuelles
current_datetime = datetime.now()

# remplace le fuseau horaire dans les deux dates et heures
expired_on = table_expire_datetime.replace(tzinfo=utc)
checked_on = current_datetime.replace(tzinfo=utc)

if expired_on < checked_on:
    print("Le temps est écoulé")
else:
    print("Le temps n'est pas écoulé")

Cela a fonctionné pour moi.

2voto

myusuf3 Points 3924

Donc, la façon dont je résoudrais ce problème serait de m'assurer que les deux datetimes sont dans le bon fuseau horaire.

Je vois que vous utilisez datetime.now() qui renverra l'heure actuelle du système, sans tzinfo défini.

tzinfo est l'information attachée à un datetime pour lui permettre de savoir dans quel fuseau horaire il se trouve. Si vous utilisez un datetime naïf, vous devez être cohérent dans l'ensemble de votre système. Je recommanderais vivement de n'utiliser que datetime.utcnow()

étant donné qu'à un moment donné vous créez des datetime qui ont un tzinfo associé, ce que vous devez faire est de vous assurer qu'ils sont localisés (ont un tzinfo associé) dans le bon fuseau horaire.

Jetez un œil à Delorean, cela facilite grandement la gestion de ce genre de choses.

1voto

Vitthal Sarode Points 11

Vous essayez de définir le fuseau horaire pour date_time qui a déjà un fuseau horaire. Utilisez les fonctions replace et astimezone.

local_tz = pytz.timezone('Asia/Kolkata')

current_time = datetime.now().replace(tzinfo=pytz.utc).astimezone(local_tz)

-1voto

Harispy Points 1

Just:

dt = datetimeObject.strftime(format) # format = votre format datetime ex) '%Y %d %m'
dt = datetime.datetime.strptime(dt,format)

Alors faites ceci :

start_time = challenge.datetime_start.strftime('%Y %d %m %H %M %S')
start_time = datetime.datetime.strptime(start_time,'%Y %d %m %H %M %S')

end_time = challenge.datetime_end.strftime('%Y %d %m %H %M %S')
end_time = datetime.datetime.strptime(end_time,'%Y %d %m %H %M %S')

et utilisez ensuite start_time et end_time

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X