J'essaie de comparer la date et l'heure actuelles avec les dates et heures spécifiées dans les modèles à l'aide d'opérateurs de comparaison:
if challenge.datetime_start <= datetime.now() <= challenge.datetime_end:
Les erreurs de script avec:
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'ai aussi django en utilisant la date et les heures locales.
Ce que je n'ai pas pu trouver, c'est le format utilisé par django pour DateTimeField (). Est-ce naïf ou conscient? Et comment faire pour que datetime.now () reconnaisse la date et l'heure de la locale?
python
django
datetime
comparison
sccrthlt
la source
la source
Réponses:
Par défaut, l'
datetime
objet estnaive
en Python, vous devez donc en faire desdatetime
objets naïfs ou conscients . Cela peut être fait en utilisant:Remarque: cela soulèverait un
ValueError
iftzinfo
est déjà défini. Si vous n'êtes pas sûr de cela, utilisez simplementBTW, vous pouvez formater un horodatage UNIX dans l'objet datetime.datetime avec les informations de fuseau horaire comme suit
la source
tzinfo
ne fait aucune conversion, ce qui rend la comparaison incorrecte.utc = pytz.utc
pour éviter l'erreur de pylintNo value for argument 'dt' in unbound method call (no-value-for-parameter)
. pytz linkdatetime.datetime.now
n'est pas conscient du fuseau horaire.Django est livré avec une aide pour cela, qui nécessite
pytz
Vous devriez pouvoir comparer
now
àchallenge.datetime_start
la source
USE_TZ=True
thentimezone.now()
renvoie un objet datetime prenant en charge le fuseau horaire même s'ilpytz
n'est pas installé (bien qu'il puisse être recommandé d'installer pour d'autres raisons).Solution d'une ligne de code
Version expliquée
Résumé
Vous devez ajouter les informations de fuseau horaire à votre
now()
datetime.Cependant, vous devez ajouter le même fuseau horaire de la variable de référence; c'est pourquoi j'ai d'abord lu l'
tzinfo
attribut.la source
Désactivez le fuseau horaire. Utilisation
challenge.datetime_start.replace(tzinfo=None);
Vous pouvez également utiliser
replace(tzinfo=None)
pour d'autres datetime .la source
Donc, la façon dont je résoudrais ce problème est de m'assurer que les deux datetimes sont dans le bon fuseau horaire.
Je peux voir que vous utilisez
datetime.now()
ce qui renverra l'heure actuelle du système, sans tzinfo défini.tzinfo est l'information attachée à un datetime pour lui faire savoir dans quel fuseau horaire il se trouve. Si vous utilisez un datetime naïf, vous devez être cohérent dans tout votre système. Je recommande vivement d'utiliser uniquement
datetime.utcnow()
vu que vous créez un datetime auquel tzinfo est associé, ce que vous devez faire est de vous assurer que ceux-ci sont localisés (a tzinfo associé) dans le bon fuseau horaire.
Jetez un œil à Delorean , cela facilite grandement la gestion de ce genre de choses.
la source
Cela fonctionne de moi. Ici, j'obtiens la table créée datetime et j'ajoute 10 minutes sur la datetime. plus tard en fonction de l'heure actuelle, les opérations d'expiration sont effectuées.
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)
Cela a fonctionné pour moi.
la source
Juste:
Alors fais ceci:
puis utilisez
start_time
etend_time
la source