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를 선호하는 이유를 더 읽고 :
- pytz 문서
- 모든 개발자가 시간에 대해 알아야 할 사항 – 많은 실제 사용 사례에 대한 개발 힌트
- 시간대 및 시간대 관련 문제-Computerphile – 시간대 (비디오) 작업의 복잡성에 대한 재미 있고 시선을 끄는 설명
답변
특정 시간대에서 현재 시간을 가져옵니다.
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
여기서 today
UTC의 하루 시작 (자정)을 나타내는 인식 가능한 날짜 시간 인스턴스 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