[python] 파이썬에서 “시간대를 인식하는”datetime.today () 값을 얻으려면 어떻게해야합니까?

datetime.today()얼마나 오래 전에 무언가를 계산하기 위해 값에서 하나의 날짜 값을 빼려고 합니다. 그러나 그것은 불평합니다 :

TypeError: can't subtract offset-naive and offset-aware datetimes

값은 datetime.today()내 다른 날짜 값 인 반면, “시간대 인식”될 것 같지 않습니다. datetime.today()시간대를 인식하는 그 가치를 어떻게 얻 습니까?

현재 현지 시간으로 시간을 제공하고 있습니다. PST는 UTC-8 시간입니다. 최악의 경우, datetime반환 된 객체에 시간대 값을 수동으로 입력하고 datetime.today()UTC-8로 설정할 수 있습니까?

물론 이상적인 해결책은 시간대를 자동으로 아는 것입니다.



답변

표준 라이브러리에는 자체 시간대 클래스를 만들지 않고 인식 가능한 시간대를 만드는 플랫폼 간 방법이 없습니다.

Windows에는이 win32timezone.utcnow()있지만 pywin32의 일부입니다. 차라리 대부분의 시간대의 데이터베이스가 지속적으로 업데이트되는 pytz 라이브러리 를 사용하는 것이 좋습니다 .

현지 시간대로 작업하는 것은 매우 까다로울 수 있으므로 (아래의 “추가 읽기”링크 참조) 응용 프로그램 전체에서 UTC를 사용하는 것이 좋습니다. 특히 두 시점 간의 차이 계산과 같은 산술 연산에 유용합니다.

다음과 같이 현재 날짜 / 시간을 얻을 수 있습니다.

import pytz
from datetime import datetime
datetime.utcnow().replace(tzinfo=pytz.utc)

것을 마음 datetime.today()datetime.now()반환 지역 때문에 적용이 아닌 UTC 시간을 시간을 .replace(tzinfo=pytz.utc)그들에게이 올바르지 않을 것입니다.

또 다른 좋은 방법은 다음과 같습니다.

datetime.now(pytz.utc)

조금 짧아서 똑같습니다.


많은 경우에 UTC를 선호하는 이유를 더 읽고 :


답변

특정 시간대에서 현재 시간을 가져옵니다.

import datetime
import pytz
my_date = datetime.datetime.now(pytz.timezone('US/Pacific'))


답변

Python 3에서 표준 라이브러리를 사용하면 UTC를 시간대로 훨씬 쉽게 지정할 수 있습니다.

>>> import datetime
>>> datetime.datetime.now(datetime.timezone.utc)
datetime.datetime(2016, 8, 26, 14, 34, 34, 74823, tzinfo=datetime.timezone.utc)

표준 라이브러리 만 사용하고 Python 2와 Python 3 모두에서 작동하는 솔루션을 원한다면 jfs의 답변을 참조하십시오 .

UTC가 아닌 현지 시간대가 필요한 경우 Mihai Capotă의 답변을 참조하십시오


답변

다음은 Python 2와 3에서 작동하는 stdlib 솔루션입니다.

from datetime import datetime

now = datetime.now(utc) # Timezone-aware datetime.utcnow()
today = datetime(now.year, now.month, now.day, tzinfo=utc) # Midnight

여기서 todayUTC의 하루 시작 (자정)을 나타내는 인식 가능한 날짜 시간 인스턴스 utc이며 tzinfo 객체입니다 ( 문서의 예 ).

from datetime import tzinfo, timedelta

ZERO = timedelta(0)

class UTC(tzinfo):
    def utcoffset(self, dt):
        return ZERO

    def tzname(self, dt):
        return "UTC"

    def dst(self, dt):
        return ZERO

utc = UTC()

관련 : 주어진 UTC 시간에 자정을 얻는 몇 가지 방법 의 성능 비교 . 참고 : UTC 오프셋이 고정되지 않은 시간대의 자정얻는 것이 더 복잡 합니다.


답변

현재 시간을 나타내는 시간대 인식 날짜 / 시간 객체를 구성하는 다른 방법 :

import datetime
import pytz

pytz.utc.localize( datetime.datetime.utcnow() )  


답변

표준 라이브러리 만 사용하는 단일 라이너는 Python 3.3부터 작동합니다. ( johnchen902에서 제안한대로 )를 datetime사용하여 현지 시간대 인식 객체를 얻을 수 있습니다 .astimezone

from datetime import datetime, timezone

aware_local_now = datetime.now(timezone.utc).astimezone()

print(aware_local_now)
# 2020-03-03 09:51:38.570162+01:00

print(repr(aware_local_now))
# datetime.datetime(2020, 3, 3, 9, 51, 38, 570162, tzinfo=datetime.timezone(datetime.timedelta(0, 3600), 'CET'))


답변

Django 를 사용하는 경우 날짜를 tz를 인식하지 못하도록 설정할 수 있습니다 ( UTC 만 ).

settings.py에서 다음 줄을 주석 처리 하십시오.

USE_TZ = True