답변:
즉, 시간대가 순진하므로 사용할 수 없습니다. datetime.astimezone
이와 같은 시간대를 지정할 수 있습니다
import pytz # 3rd party: $ pip install pytz
u = datetime.utcnow()
u = u.replace(tzinfo=pytz.utc) #NOTE: it works only with a fixed utc offset
이제 시간대를 변경할 수 있습니다
print(u.astimezone(pytz.timezone("America/New_York")))
주어진 시간대에서 현재 시간을 얻으려면 tzinfo를 datetime.now()직접 전달할 수 있습니다.
#!/usr/bin/env python
from datetime import datetime
import pytz # $ pip install pytz
print(datetime.now(pytz.timezone("America/New_York")))
일광 절약 시간 (DST)을 준수하는 시간대를 포함하여 모든 시간대에서 작동합니다. 즉, 다른 시간에 다른 utc 오프셋을 가질 수있는 시간대 (고정되지 않은 utc 오프셋)에서 작동합니다. 사용하지 마십시오 tz.localize(datetime.now()). 현지 시간이 모호한 경우 DST 종료 전이 중에 실패 할 수 있습니다.
astimezone. 따라서 datetime에는 기본 시간대가 없을뿐만 아니라 널리 사용 가능한 tzinfo 구현은 가정 된 표준을 준수하지 않습니다.
u=datetime.now(pytz.utc)
tz.localize(datetime.now()); 사용하는 datetime.now(tz)대신.
Python 3.2 이후에는 datetime모듈에가 포함되어 있습니다 datetime.timezone. 에 대한 설명서 datetime.utcnow()는 다음과 같습니다.
을 호출하여 현재 UTC 날짜 시간을 알 수 있습니다 .
datetime.now(timezone.utc)
그래서 당신은 할 수 있습니다 :
>>> import datetime
>>> datetime.datetime.now(datetime.timezone.utc)
datetime.datetime(2014, 7, 10, 2, 43, 55, 230107, tzinfo=datetime.timezone.utc)
datetime.now(timezone.utc)또는 datetime.utcnow(timezone.utc)?
datetime.utcnow()논쟁이 없다. 따라서이어야 datetime.now(timezone.utc)합니다.
datetime.now()기계 시간 datetime.utcnow()을 반환 하지만 실제 UTC 시간을 반환합니다.
datetime.utcnow()설정되지 않았습니다 tzinfo. 그러나 설정된 datetime.now(datetime.timezone.utc)UTC 시간 을 반환 tzinfo합니다.
tz지금 생성자에서 객체를 전달하면 해당 시간대의 시간을 반환합니까? 확인! 지적 해 주셔서 감사합니다.
표준 파이썬 라이브러리에는 tzinfo 클래스가 포함되어 있지 않습니다 (그러나 pep 431 참조) ). 이유 만 추측 할 수 있습니다. 개인적으로 UTC에 tzinfo 클래스를 포함시키지 않는 것은 실수라고 생각합니다. 표준 구현을 가질만큼 논란의 여지가 없기 때문입니다.
편집 : 라이브러리에는 구현이 없지만 tzinfodocumentation에 예제가 있습니다 .
from datetime import timedelta, tzinfo
ZERO = timedelta(0)
# A UTC class.
class UTC(tzinfo):
"""UTC"""
def utcoffset(self, dt):
return ZERO
def tzname(self, dt):
return "UTC"
def dst(self, dt):
return ZERO
utc = UTC()
이를 사용하려면 현재 시간을 인식 가능한 datetime 객체로 가져 오십시오.
from datetime import datetime
now = datetime.now(utc)
datetime.timezone.utcPython 3.2 이상 에는 다음이 있습니다 .
from datetime import datetime, timezone
now = datetime.now(timezone.utc)
datetime만든 객체에 사용 된 utcnow()) 이유를 알아보십시오 ...
timezone.utc가 마침내 Python 3.2에 추가되었습니다. 이전 버전과의 호환성을 utcnow()위해 표준 시간대없는 시간 개체를 반환하지만을 호출하여 원하는 것을 얻을 수 있습니다 now(timezone.utc).
struct모듈은 유니 코드에서 바이트 문자열로 자동 변환을 수행하며 최종 결정은 잘못된 결정이 진행되는 것을 방지하기 위해 이전 Python 3 버전과의 호환성을 중단하는 것입니다.
tzinfo문서에는 그것을 구현하는 코드의 예가 포함되어 있지만, 날짜 시간 자체에는 해당 기능이 포함되어 있지 않습니다. docs.python.org/2/library/datetime.html#datetime.tzinfo.fromutc
pytz훌륭한 자료입니다. 예제 코드를 작성하기 위해 내 답변을 편집 할 때 누군가 다른 사람이 이미 제안했으며 천둥을 훔치고 싶지 않았습니다.
pytz모듈은 하나 개의 옵션이며, 또 다른이python-dateutil 있지만 타사 패키지는, 또한 이미 다른 종속성 및 운영 체제에 따라 사용할 수있다.
방금이 방법론을 참조 용으로 포함하고 싶었습니다. 이미 python-dateutil다른 목적으로 설치 한 경우 tzinfo에는 복제 하는 대신 사용할 수 있습니다pytz
import datetime
import dateutil.tz
# Get the UTC time with datetime.now:
utcdt = datetime.datetime.now(dateutil.tz.tzutc())
# Get the UTC time with datetime.utcnow:
utcdt = datetime.datetime.utcnow()
utcdt = utcdt.replace(tzinfo=dateutil.tz.tzutc())
# For fun- get the local time
localdt = datetime.datetime.now(dateutil.tz.tzlocal())
전화를 utcnow하려면 UTC 시간대 정보가 포함되어야 한다는 데 동의합니다 . 기본 날짜 시간 라이브러리는 기본적으로 상호 호환성을 위해 순진 날짜 시간으로 설정되므로 이것이 포함되지 않은 것 같습니다.
utcdt = datetime.datetime.utcfromtimestamp(1234567890).replace(dateutil.tz.tzutc())
datetime.now(pytz_tz)항상 작동합니다. datetime.now(dateutil.tz.tzlocal())DST 전환 중에 실패 할 수 있습니다 . PEP 495-현지 시간 모호함 은 dateutil향후 상황을 개선 할 수 있습니다.
utc_dt = datetime.fromtimestamp(1234567890, dateutil.tz.tzutc())(: 메모를 dateutil상쇄 비 고정 UTC (예와 함께 dateutil.tz.tzlocal()여기에 실패 할 수 있습니다) 사용 대신 기반 솔루션 ). pytz
dateutil에 대해 dateutil.parser, 나는 최선이 솔루션을 좋아했다. 다음과 같이 간단했습니다 utcCurrentTime = datetime.datetime.now(tz=dateutil.tz.tzutc()). 비올라!!
Julien Danjou는 왜 시간대를 다루지 말아야하는지 설명하는 좋은 기사를 썼습니다 . 발췌 :
실제로 Python datetime API는 항상 알지 못하는 datetime 객체를 반환하므로 매우 불행합니다. 실제로이 개체 중 하나를 가져 오면 표준 시간대를 알 수있는 방법이 없으므로 이러한 개체는 자체적으로 "무용지물"입니다.
아아, 당신이 사용할 수는 있지만 utcnow(), 발견 한대로 시간대 정보는 여전히 표시되지 않습니다.
추천 :
항상
datetime시간대 정보와 같은 인식 객체를 사용 하십시오. 이를 통해 직접 비교할 수 있으며 (인식 및 인식datetime되지 않는 객체는 비교할 수 없음) 사용자에게 올바르게 반환합니다. pytz 를 활용 하여 표준 시간대 개체를 갖습니다.입력 및 출력 문자열 형식으로 ISO 8601 을 사용하십시오 . 사용
datetime.datetime.isoformat()문자열로 반환 타임 스탬프로는 시간대 정보를 포함하는 형식을 사용하여 포맷.ISO 8601 형식의 타임 스탬프가 포함 된 문자열을 구문 분석해야하는 경우을 사용
iso8601하여 올바른 시간대 정보가있는 타임 스탬프를 반환 할 수 있습니다 . 타임 스탬프를 직접 비교할 수 있습니다.
timezonePython 3.2 이상에서 정보 를 추가하려면
import datetime
>>> d = datetime.datetime.now(tz=datetime.timezone.utc)
>>> print(d.tzinfo)
'UTC+00:00'
AttributeError: 'module' object has no attribute 'timezone' 파이썬 2.7.13 (기본값 월 (19) 2017 14시 48분 8초)
from datetime import datetime
from dateutil.relativedelta import relativedelta
d = datetime.now()
date = datetime.isoformat(d).split('.')[0]
d_month = datetime.today() + relativedelta(months=1)
next_month = datetime.isoformat(d_month).split('.')[0]
UTC 날짜는 UTC이므로 시간대 정보가 필요하지 않습니다. 정의에 따르면 오프셋이 없습니다.
pytz.utc). UTC로부터의 오프셋을 알 수없는 값과 0으로 알려진 값 사이에는 큰 차이가 있습니다. 후자는 IMO를 반환 utcnow() 해야합니다 . 이는 문서에 따라 "인식 대상은 해석에 개방되지 않은 특정 시점을 나타내는 데 사용됩니다"와 일치합니다.