web-dev-qa-db-ja.com

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)を受け取りました。 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)
243
shifu

問題は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)

そのため、どこかにEメールの日付を渡す場合(そしてそれは最終的にはいくつかのモデルになります)、Djangoのnow()を使用してください。そうでない場合は、おそらくタイムゾーンなしで日付を取得する既存のパッケージの問題であり、パッケージにパッチを適用したり、警告を無視したり、USE_TZをFalseに設定したりできます。

413
kravietz

単純なdatetimeオブジェクトをタイムゾーン対応にし、これらの警告を回避するには、 Django.utils.timezone.make_aware 関数を使用します。

(timezone情報なしの)単純なdatetimeオブジェクトを(2番目の引数として明示的に指定しない場合はDjangoの設定で指定されたtimezoneを使用して)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>
26
dmrz

現在時刻を設定するためにエラーを修正するためだけに

from Django.utils import timezone
import datetime

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

警告を修正するの両方を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を使うことです。dmrzpostを見てください。

1
Edouard Thiel

早くて汚い - 電源を切る:

USE_TZ = False

あなたのsettings.py

0
gies0r

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の設定でタイムゾーンが設定された日時です。

0
hcf1425