Django RuntimeWarning:DateTimeField接收到原始日期时间
我正在尝试使用IPython发送一封简单的邮件。我还没有建立任何模型仍然得到这个错误。可以做些什么 错误: /home/sourabh/Django/learn/local/lib/python2.7/site packages/Django/db/models/fields/init。py:827:RuntimeWarning:DateTimeField在时区支持处于活动状态时收到一个原始日期时间(2013-09-04 14:14:13.698105)。 运行时警告) 已尝试:第一步是将Django RuntimeWarning:DateTimeField接收到原始日期时间,django,django-mailer,Django,Django Mailer,我正在尝试使用IPython发送一封简单的邮件。我还没有建立任何模型仍然得到这个错误。可以做些什么 错误: /home/sourabh/Django/learn/local/lib/python2.7/site packages/Django/db/models/fields/init。py:827:RuntimeWarning:DateTimeField在时区支持处于活动状态时收到一个原始日期时间(2013-09-04 14:14:13.698105)。 运行时警告) 已尝试:第一步是将USE
USE_TZ=True
添加到设置文件中,并安装pytz
(如果可能)
错误已更改:
(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)
问题不在Django设置中,而是在传递给模型的日期中。以下是时区感知对象的外观:
>>> from django.utils import timezone
>>> import pytz
>>> timezone.now()
datetime.datetime(2013, 11, 20, 20, 8, 7, 127325, tzinfo=pytz.UTC)
这是一个天真的对象:
>>> from datetime import datetime
>>> datetime.now()
datetime.datetime(2013, 11, 20, 20, 9, 26, 423063)
因此,如果您在任何地方传递电子邮件日期(最终会到达某个模型),只需使用Django的now()
。如果不是,则可能是现有的获取日期而没有时区的包存在问题,您可以修补该包,忽略警告或将USE_TZ设置为False。使用函数使原始datetime对象了解时区并避免这些警告
它将原始datetime对象(不含时区信息)转换为具有时区信息的对象(如果未将其明确指定为第二个参数,则使用django设置中指定的时区):
导入日期时间
从django.conf导入设置
从django.utils.timezone导入使您知道
naive_datetime=datetime.datetime.now()
Naiver_datetime.tzinfo#无
settings.TIME_ZONE#“UTC”
aware_datetime=使_知晓(naive_datetime)
aware_datetime.tzinfo#
只是为了修复设置当前时间的错误
from django.utils import timezone
import datetime
datetime.datetime.now(tz=timezone.utc) # you can use this value
可以修复警告并使用settings.py中指定的时区,该时区可能与UTC不同 例如,在my settings.py中,我有:
USE_TZ = True
TIME_ZONE = 'Europe/Paris'
这里有一个解决方案;优点是str(mydate)
提供了正确的时间:
>>> 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'
>>从datetime导入datetime
>>>从django.utils.timezone导入获取当前时区
>>>mydate=datetime.now(tz=get\u current\u timezone())
>>>mydate
datetime.datetime(2019、3、10、11、16、9、184106、,
tzinfo=)
>>>str(mydate)
'2019-03-10 11:16:09.184106+01:00'
另一种等效方法是使用
使您知道,请参阅dmrz post。快速且肮脏-将其关闭:
USE_TZ = False
在您的settings.py
中,如果您试图将原始日期时间转换为django时区的日期时间,以下是我的解决方案:
>>> 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>)
>>>
导入日期时间
>>>从django.utils导入时区
>>>t1=datetime.datetime.strtime(“2019-07-16 22:24:00,“%Y-%m-%d%H:%m:%S”)
>>>t1
日期时间。日期时间(2019、7、16、22、24)
>>>当前时区。获取当前时区()
>>>t2=电流局部化(t1)
>>>t2
datetime.datetime(2019,7,16,22,24,tzinfo=)
>>>
t1是一个简单的日期时间,t2是django设置中带有时区的日期时间。您还可以覆盖设置,在测试中特别有用:
from django.test import override_settings
with override_settings(USE_TZ=False):
# Insert your code that causes the warning here
pass
这将阻止您看到警告,同时代码中任何需要时区感知日期时间的内容都可能给您带来问题。如果是这种情况,请参见kravietz答案。在模型中,不要传递值:
timezone.now()
而是删除括号,然后传递:
timezone.now
如果您继续获得运行时错误警告,请考虑将模型字段从DATETIEMEDE更改为DATEFIEL.
确保StutsP.Py
USE_TZ=True
在python文件中:
from django.utils import timezone
timezone.now() # use its value in model field
你在哪里写tzinfo=
,什么是
?这不是我见过的一个语法结构。晚会有点晚了,但你看到的是shell的输出。更具体地说,它是datetime对象的repr方法的输出,返回对象的可打印信息。在使用datetime.now
的地方,将其更改为timezone.now
,并将从django.utils导入timezone
添加到顶部。对于仍在查找该部分的用户,您可以使用此选项:import pytz
datetime.datetime(2013,11,20,20,8,7127325,tzinfo=pytz.UTC)
我的设置是use\TZ=True
,时区='UTC'
。但是当我使用timezone.now()
时,它不会显示tzinfo=
。。。。因此,这个datetime对象作为原始对象传递。为什么会发生这种情况?对于datetime.datetime(9999,01,01,tzinfo=timezone.utc)IMO来说,这是django.utils import timezone timezone最实用的解决方案。now()#在USE#TZ为真且数据库支持时区(例如PostgreSQL)时也可以工作,设置此选项是一个错误,感谢您的回答,这是最符合django标准的将原始日期转换为带有django设置时区的日期的方法:)是否可以将其放入模型中。py?@Florent如果默认使用utc时区,则无需更改模型中的任何内容,auto_now
和auto_now_add
将适用于日期时间字段。如果出于某种原因需要在模型中具有时区感知的当前日期时间对象,请使用django.utils.timezone.now()
函数。
from django.utils import timezone
timezone.now() # use its value in model field