RuntimeWarning: DateTimeField received a naive datetime
I m trying to send a simple mail using IPython. I have not set up any models still getting this error. What can be done? Error : /home/sourabh/Django/learn/local/lib/python2.7/site-packages/django/db/models/fields/init.py:827: RuntimeWarning: DateTimeField received a naive datetime (2013-09-04 14:14:13.698105) while time zone support is active. RuntimeWarning) Tried : The first step is to add USE_TZ = True to your settings file and install pytz (if possible). Error changed: (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)
The problem is not in Django settings, but in the date passed to the model. Here’s how a timezone-aware object looks like:
>>> from django.utils import timezone >>> import pytz >>> timezone.now() datetime.datetime(2013, 11, 20, 20, 8, 7, 127325, tzinfo=pytz.UTC)
And here’s a naive object:
>>> from datetime import datetime >>> datetime.now() datetime.datetime(2013, 11, 20, 20, 9, 26, 423063)
So if you are passing email date anywhere (and it eventually gets to some model), just use Django’s
now(). If not, then it’s probably an issue with an existing package that fetches date without timezone and you can patch the package, ignore the warning or set USE_TZ to False.
Use django.utils.timezone.make_aware function to make your naive datetime objects timezone aware and avoid those warnings.
It converts naive datetime object (without timezone info) to the one that has timezone info (using timezone specified in your django settings if you don’t specify it explicitly as a 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>
Just to fix the error to set current time
from django.utils import timezone import datetime datetime.datetime.now(tz=timezone.utc) # you can use this value
One can both fix the warning and use the timezone specified in settings.py, which might be different from UTC.
For example in my settings.py I have:
USE_TZ = True TIME_ZONE = 'Europe/Paris'
Here is a solution; the advantage is that
str(mydate) gives the correct time:
>>> 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'
Another equivalent method is using
make_aware, see dmrz post.
Quick and dirty – Turn it off:
USE_TZ = False
If you are trying to transform a naive datetime into a datetime with timezone in django, here is my 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 is a naive datetime and t2 is a datetime with timezone in django’s settings.
You can also override settings, particularly useful in tests:
from django.test import override_settings with override_settings(USE_TZ=False): # Insert your code that causes the warning here pass
This will prevent you from seeing the warning, at the same time anything in your code that requires a timezone aware datetime may give you problems. If this is the case, see kravietz answer.
- Database Administration Tutorials
- Programming Tutorials & IT News
- Linux & DevOps World
- Entertainment & General News
- Games & eSport