错误:
/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)。
RuntimeWarning)
:尝试过的第一步是将
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)
#1 楼
问题不在于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。#2 楼
使用django.utils.timezone.make_aware函数可让您的朴素日期时间对象意识到时区并避免这些警告。它将朴素日期时间对象(无时区信息)转换为具有时区信息的对象(使用时区)如果未将其明确指定为第二个参数,则在django设置中指定):
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>
评论
感谢您的回答,这是将Django日期转换为具有Django设置时区的日期的最符合Django的方法:)
– sodimel
19-10-9的15:00
是否可以将其放在models.py中?
–佛罗伦萨
20年1月18日,0:18
@Florent,如果您默认使用utc时区,则无需更改模型中的任何内容,auto_now和auto_now_add将对datetime字段正常工作。如果出于某种原因需要在模型中使时区感知当前日期时间对象,请使用django.utils.timezone.now()函数。
– dmrz
20年1月29日在14:48
#3 楼
只是为了解决错误以设置当前时间from django.utils import timezone
import datetime
datetime.datetime.now(tz=timezone.utc) # you can use this value
评论
并且对于datetime.datetime(9999,01,01,tzinfo = timezone.utc)
– I. Yegor
18-3-21在11:11
IMO这是最实用的解决方案
–拉姆丁
20-4-25在11:07
从django.utils导入时区timezone.now()#也可以工作
–杰伊·索尼(Jay Soni)
20年8月23日在10:37
#4 楼
既可以修正警告,也可以使用settings.py中指定的时区,这可能与UTC不同。例如在我的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'
另一种等效方法是使用
make_aware
,请参见dmrz post。#5 楼
快速又脏-将其关闭:USE_TZ = False
settings.py
中的评论
当USE_TZ为True且数据库支持时区(例如PostgreSQL)时,设置此选项docs.djangoproject.com/en/2.2/ref/settings/#time-zone是错误的
– Marcaum54
19年8月2日在12:12
#6 楼
您还可以覆盖设置,这些设置在测试中特别有用:from django.test import override_settings
with override_settings(USE_TZ=False):
# Insert your code that causes the warning here
pass
这将防止您同时看到警告,同时代码中的任何内容都需要了解时区datetime可能会给您带来麻烦。如果是这种情况,请参阅kravietz答案。
#7 楼
如果要在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>)
>>>
t1是原始日期时间,而t2是日期时间, django设置中的时区。
#8 楼
在模型中,请勿传递值:timezone.now()
,而是删除括号并传递:
timezone.now
如果继续收到运行时错误警告,请考虑更改从DateTimeField到DateField的模型字段。
#9 楼
确保settings.py在您的python文件中具有USE_TZ = True
:
from django.utils import timezone
timezone.now() # use its value in model field
评论
在哪里写tzinfo =
–jameshfisher
15年2月13日在10:28
聚会有点晚了,但是您看到的是从Shell输出的。更具体地说,是datetime对象的repr方法的输出,返回该对象的可打印信息。
–乔治·格里芬(George Griffin)
15年3月9日在21:38
在使用datetime.now的地方,将其更改为timezone.now,然后从顶部的django.utils import timezone添加。
– Unoti
2015年10月21日在21:29
对于仍在寻找该
– Anoyz
16年11月2日在16:10
我的设置是USE_TZ = True,TIME_ZONE ='UTC'。但是,当我使用timezone.now()时,它没有显示tzinfo =
–user3595632
17年5月9日在6:16