datetime.datetime.utcnow()
datetime
명시 적으로 UTC라는 시간대 정보가없는 이유는 무엇 datetime
입니까?
나는 이것을 포함 할 것으로 기대한다 tzinfo
.
답변
즉, 시간대가 순진하므로 사용할 수 없습니다. 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 종료 전이 중에 실패 할 수 있습니다.
답변
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)
답변
표준 파이썬 라이브러리에는 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)
답변
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 시간대 정보가 포함되어야 한다는 데 동의합니다 . 기본 날짜 시간 라이브러리는 기본적으로 상호 호환성을 위해 순진 날짜 시간으로 설정되므로 이것이 포함되지 않은 것 같습니다.
답변
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'
답변
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]