RuntimeWarning : DateTimeField가 순진한 datetime을 받았습니다


310

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_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)

답변:


488

문제는 장고 설정이 아니라 모델에 전달 된 날짜 에 있습니다. 시간대 인식 객체의 모양은 다음과 같습니다.

>>> 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 's를 사용하십시오 now(). 그렇지 않은 경우 시간대없이 날짜를 가져 오는 기존 패키지의 문제 일 수 있으며 패키지를 패치하거나 경고를 무시하거나 USE_TZ를 False로 설정할 수 있습니다.


8
당신이 쓰는 곳 tzinfo=<UTC>, 무엇 <UTC>입니까? 그것은 내가 본 구문 구조가 아닙니다.
jameshfisher 10

4
파티에 약간 늦었지만보고있는 것은 쉘에서 출력 됩니다. 보다 구체적으로, datetime 객체의 repr 메소드 의 출력으로, 객체의 인쇄 가능한 정보를 반환합니다.
George Griffin

36
을 (를) 사용했던 장소에서로 datetime.now변경 하고 맨 위에 timezone.now추가 from django.utils import timezone하십시오.
Unoti

12
여전히 <UTC> 부분을 찾는 사람들을 위해 이것을 사용할 수 있습니다 :import pytz datetime.datetime(2013, 11, 20, 20, 8, 7, 127325, tzinfo=pytz.UTC)
Anoyz

내 설정은 USE_TZ = True, TIME_ZONE = 'UTC'. 그러나 내가 사용할 때 timezone.now()표시되지 않습니다 tzinfo=<UTC>.... 그래서이 datetime 객체는 순진한 객체로 전달됩니다. 왜 그런가요?
user3595632

71

순진한 datetime 객체를 표준 시간대로 인식하고 이러한 경고를 피 하려면 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>

이 답변을 주셔서 감사합니다, 그것은 내 장고 설정의 시간대와 순진한 날짜를 날짜로 변환하는 가장 장고 호환 방법입니다 :)
sodimel

models.py에 넣을 수 있습니까?
플로 렌트

당신은 기본적으로 UTC 시간대를 사용하는 경우 @Florent 모델 변경 아무것도 필요가 없습니다 auto_nowauto_now_add날짜 필드에 대한 벌금을 작동합니다. 어떤 이유로 모델에서 시간대를 인식하여 현재 날짜 / 시간 객체를 모델에 제공해야하는 경우- django.utils.timezone.now()함수를 사용하십시오 .
dmrz

26

현재 시간을 설정하기 위해 오류를 수정하기 만하면됩니다.

from django.utils import timezone
import datetime

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

4
datetime.datetime (9999, 01, 01, tzinfo = timezone.utc)
I. Yegor

IMO 이것이 가장 실용적인 솔루션입니다
Ramtin

9

하나는 모두 수정 경고 수 UTC 다를 수 있습니다 settings.py에 지정된 시간대를 사용합니다.

예를 들어 내 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_awaredmrz post 참조).



3

특히 테스트에 유용한 설정을 무시할 수도 있습니다.

from django.test import override_settings

with override_settings(USE_TZ=False):
    # Insert your code that causes the warning here
    pass

이렇게하면 시간대 인식 날짜 / 시간이 필요한 코드에서 문제가 발생할 수있는 경고가 표시되지 않습니다. 이 경우 kravietz 답변을 참조하십시오.


2

장고의 시간대를 사용하여 순진한 날짜 시간을 날짜 시간으로 변환하려고하면 내 해결책이 있습니다.

>>> 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 설정에서 시간대가있는 날짜 시간입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.