[python] datetime.datetime.utcnow ()에 시간대 정보가없는 이유는 무엇입니까?

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 클래스를 포함시키지 않는 것은 실수라고 생각합니다. 표준 구현을 가질만큼 논란의 여지가 없기 때문입니다.

편집 : 라이브러리에는 구현이 없지만 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)


답변

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하여 올바른 시간대 정보가있는 타임 스탬프를 반환 할 수 있습니다 . 타임 스탬프를 직접 비교할 수 있습니다.


답변

timezonePython 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]