답변:
즉, 시간대가 순진하므로 사용할 수 없습니다. 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 클래스를 포함시키지 않는 것은 실수라고 생각합니다. 표준 구현을 가질만큼 논란의 여지가 없기 때문입니다.
편집 : 라이브러리에는 구현이 없지만 tzinfo
documentation에 예제가 있습니다 .
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.utc
Python 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
하여 올바른 시간대 정보가있는 타임 스탬프를 반환 할 수 있습니다 . 타임 스탬프를 직접 비교할 수 있습니다.
timezone
Python 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()
해야합니다 . 이는 문서에 따라 "인식 대상은 해석에 개방되지 않은 특정 시점을 나타내는 데 사용됩니다"와 일치합니다.