RuntimeWarning:DateTimeField收到一个天真的日期时间

shi*_*ifu 264 django django-mailer

我试图使用IPython发送一个简单的邮件.我还没有设置任何仍然出现此错误的模型.可以做些什么?

错误:/home/sourabh/Django/learn/local/lib/python2.7/site-packages/django/db/models/fields/ 初始化的.py:827:RuntimeWarning:DateTimeField字段接收到的日期时间幼稚(2013年9月4日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)
Run Code Online (Sandbox Code Playgroud)

kra*_*etz 440

问题不在于Django设置,而是在传递给模型的日期.以下是时区感知对象的外观:

>>> from django.utils import timezone
>>> import pytz
>>> timezone.now()
datetime.datetime(2013, 11, 20, 20, 8, 7, 127325, tzinfo=pytz.UTC)
Run Code Online (Sandbox Code Playgroud)

这是一个天真的对象:

>>> from datetime import datetime
>>> datetime.now()
datetime.datetime(2013, 11, 20, 20, 9, 26, 423063)
Run Code Online (Sandbox Code Playgroud)

因此,如果您在任何地方传递电子邮件日期(并且最终会获得某些模型),请使用Django now().如果没有,那么现有的包可能是一个问题,它在没有时区的情况下获取日期,您可以修改包,忽略警告或将USE_TZ设置为False.

  • 在使用`datetime.now`的地方,将其更改为`timezone.now`,并在顶部添加`from django.utils import timezone`. (29认同)
  • 对于仍在寻找那个<UTC>部分的人,可以使用:`import pytz``datetime.datetime(2013,11,20,20,8,7,127325,tzinfo = pytz.UTC) (12认同)
  • 在哪里写`tzinfo = <UTC>`,什么是`<UTC>`?这不是我见过的句法结构. (6认同)
  • 派对有点晚了,但你看到的是来自shell的**输出**.更具体地说,它是datetime对象的__repr__方法的输出,它返回对象的可打印信息. (3认同)
  • 我的设置是`USE_TZ = True`,`TIME_ZONE = 'UTC'`。但是当我使用 `timezone.now()` 时,它不显示 `tzinfo=&lt;UTC&gt;`.... 所以这个 datetime 对象被作为天真的对象传递。为什么会发生? (2认同)

dmr*_*mrz 49

使用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>
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的回答,这是将天真的日期转换为具有我的 django 设置时区的日期的最符合 django 的方式:) (2认同)

gie*_*s0r 14

又快又脏——把它关掉:

USE_TZ = False
Run Code Online (Sandbox Code Playgroud)

在你的 settings.py

  • 当 USE_TZ 为 True 并且数据库支持时区(例如 PostgreSQL)时,设置此选项是错误的 https://docs.djangoproject.com/en/2.2/ref/settings/#time-zone (3认同)

Sac*_* G. 11

只是为了修复错误来设置当前时间

from django.utils import timezone
import datetime

datetime.datetime.now(tz=timezone.utc) # you can use this value
Run Code Online (Sandbox Code Playgroud)

  • 并且对于datetime.datetime(9999,01,01,tzinfo = timezone.utc) (2认同)

rad*_*tek 9

您还可以覆盖设置,在测试中特别有用:

from django.test import override_settings

with override_settings(USE_TZ=False):
    # Insert your code that causes the warning here
    pass
Run Code Online (Sandbox Code Playgroud)

这将阻止您看到警告,同时您的代码中需要时区感知日期时间的任何内容都可能会给您带来问题。如果是这种情况,请参阅 kravietz 的回答。


小智 8

在模型中,不要传递值:

timezone.now()
Run Code Online (Sandbox Code Playgroud)

相反,删除括号并传递:

timezone.now
Run Code Online (Sandbox Code Playgroud)

如果您继续收到运行时错误警告,请考虑将模型字段从 DateTimeField 更改为 DateField。


hcf*_*425 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>)
>>>
Run Code Online (Sandbox Code Playgroud)

t1 是一个简单的日期时间,而 t2 是 django 设置中带有时区的日期时间。


小智 7

确保 settings.py 有 USE_TZ = True

在你的 python 文件中:

from django.utils import timezone

timezone.now() # use its value in model field

Run Code Online (Sandbox Code Playgroud)


Edo*_*iel 5

既可以修复警告也可以使用settings.py中指定的时区,这可能与UTC不同。

例如在我的settings.py中,我有:

USE_TZ = True
TIME_ZONE = 'Europe/Paris'
Run Code Online (Sandbox Code Playgroud)

这是一个解决方案;优点是可以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'
Run Code Online (Sandbox Code Playgroud)

另一种等效的方法是使用make_aware,请参见dmrz post。