web-dev-qa-db-fra.com

RuntimeWarning: DateTimeField a reçu une date / heure naïve

J'essaie d'envoyer un courrier simple en utilisant IPython. Je n'ai pas encore configuré de modèles qui obtiennent toujours cette erreur. Ce qui peut être fait?

Erreur: /home/sourabh/Django/learn/local/lib/python2.7/site-packages/Django/db/models/fields/init.py:827: RuntimeWarning: DateTimeField a reçu un naive datetime (2013-09-04 14: 14: 13.698105) lorsque la prise en charge du fuseau horaire est active. RuntimeWarning)

Essayé: La première étape consiste à ajouter USE_TZ = True à votre fichier de paramètres et à installer pytz (si possible).

Erreur changé:

(learn)sourabh@sL:~/Django/learn/event$ python manage.py Shell
/home/sourabh/Django/learn/local/lib/python2.7/site-packages/Django/db/backends/sqlite3/base.py:53: RuntimeWarning: SQLite received a naive datetime (2013-09-05 00:59:32.181872) while time zone support is active.
  RuntimeWarning)
254
shifu

Le problème ne réside pas dans les paramètres Django, mais dans le date transmis au modèle. Voici à quoi ressemble un objet sensible au fuseau horaire:

>>> from Django.utils import timezone
>>> import pytz
>>> timezone.now()
datetime.datetime(2013, 11, 20, 20, 8, 7, 127325, tzinfo=pytz.UTC)

Et voici un objet naïf:

>>> from datetime import datetime
>>> datetime.now()
datetime.datetime(2013, 11, 20, 20, 9, 26, 423063)

Donc, si vous passez la date de l'email n'importe où (et qu'il finisse par arriver à un modèle), utilisez simplement now() de Django. Sinon, c'est probablement un problème avec un package existant qui récupère une date sans fuseau horaire et vous pouvez corriger le package, ignorer l'avertissement ou définir USE_TZ sur False.

424
kravietz

Utilisez la fonction Django.utils.timezone.make_aware pour rendre vos objets de date et heure naïfs conscients du fuseau horaire et éviter ces avertissements.

Il convertit l'objet naïf datetime (sans information de fuseau horaire) en un objet comportant des informations de fuseau horaire (en utilisant le fuseau horaire spécifié dans vos paramètres Django si vous ne le spécifiez pas explicitement comme second argument):

import datetime
from Django.conf import settings
from Django.utils.timezone import make_aware

naive_datetime = datetime.datetime.now()
naive_datetime.tzinfo  # None

settings.TIME_ZONE  # 'UTC'
aware_datetime = make_aware(naive_datetime)
aware_datetime.tzinfo  # <UTC>
36
dmrz

Juste pour corriger l'erreur de régler l'heure actuelle

from Django.utils import timezone
import datetime

datetime.datetime.now(tz=timezone.utc) # you can use this value
9
Sachin G.

On peut corriger l’avertissement et utiliser le fuseau horaire spécifié dans settings.py, qui peut être différent de UTC.

Par exemple dans mon settings.py j'ai:

USE_TZ = True
TIME_ZONE = 'Europe/Paris'

Voici une solution. l'avantage est que str(mydate) donne l'heure correcte:

>>> from datetime import datetime
>>> from Django.utils.timezone import get_current_timezone
>>> mydate = datetime.now(tz=get_current_timezone())
>>> mydate
datetime.datetime(2019, 3, 10, 11, 16, 9, 184106, 
    tzinfo=<DstTzInfo 'Europe/Paris' CET+1:00:00 STD>)
>>> str(mydate)
'2019-03-10 11:16:09.184106+01:00'

Une autre méthode équivalente utilise make_aware, voir l'article de dmrz.

5
Edouard Thiel

Rapide et sale - Éteignez-le:

USE_TZ = False

dans votre settings.py

1
gies0r

Si vous essayez de transformer une date/heure naïve en une date/heure avec fuseau horaire dans Django, voici ma solution:

>>> import datetime
>>> from Django.utils import timezone
>>> t1 = datetime.datetime.strptime("2019-07-16 22:24:00", "%Y-%m-%d %H:%M:%S")
>>> t1
    datetime.datetime(2019, 7, 16, 22, 24)
>>> current_tz = timezone.get_current_timezone()
>>> t2 = current_tz.localize(t1)
>>> t2
    datetime.datetime(2019, 7, 16, 22, 24, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)
>>>

t1 est une date et heure naïve et t2 est une date et heure avec un fuseau horaire défini dans les paramètres de Django.

0
hcf1425