我想用IPython发送一封简单的邮件。我没有建立任何模型仍然得到这个错误。我们能做些什么呢?

错误: /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)

尝试:第一步是在设置文件中添加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中把一个天真的datetime转换成一个带时区的datetime,下面是我的解决方案:

>>> 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是一个naive datetime, t2是一个带timezone的datetime。

其他回答

在模型中,不要传递值:

timezone.now()

相反,去掉括号,并传递:

timezone.now

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

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

from django.utils import timezone
import datetime

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

使用django.utils.timezone。Make_aware函数使您的天真datetime对象具有时区意识,并避免这些警告。

它将天真的datetime对象(没有timezone info)转换为有timezone info的对象(如果你没有显式地将timezone作为第二个参数,则使用django设置中指定的timezone):

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>

可以修复警告,也可以使用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。

确保settings.py有 USE_TZ = True

在你的python文件中:

from django.utils import timezone

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