programing

datetime 값을 얻으려면 어떻게 해야 합니까?python에서 timezone을 인식하고 있습니까?

luckcodes 2022. 9. 19. 22:06

datetime 값을 얻으려면 어떻게 해야 합니까?python에서 timezone을 인식하고 있습니까?

빼려고 .datetime.datetime.today()불평은 다음과 같습니다.하지만 그것은 불평한다.

TypeError: can't subtract offset-naive and offset-aware datetimes

「」로부터의:datetime.datetime.today()" 인식 것 같습니다만, 날짜 " 인식"입니다.타임존 인식"이 아닌 것 같습니다만, 다른 날짜 값은 "시간대 인식"입니다.은 어떻게 얻을 수 요?datetime.datetime.today()간대대 인식 ?? ????

최적의 솔루션은 자동으로 시간대를 파악하는 것입니다.

현재, 현지 시간으로 시간을 알 수 있습니다. PST는 UTC - 8시간입니다.의 경우 값을 할 수 있는 ?datetime되는 datetime.datetime.today()UTC-8은?

표준 라이브러리에서는, 독자적인 타임 존 클래스를 작성하지 않고, 인식 타임 존을 작성하는 크로스 플랫폼 방법은 없습니다.(편집: Python 3.9는 이 기능을 제공하는 표준 라이브러리에 도입되어 있습니다.)

서,가 있습니다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를 선호하는 이유를 자세히 읽고 관찰합니다.

특정 시간대의 현재 시간을 가져옵니다.

import datetime
import pytz
my_date = datetime.datetime.now(pytz.timezone('US/Pacific'))

먼저 설치하는 것을 잊지 마십시오.

.2의 경우: Python 3.2+의 경우:datetime.timezone.utc:

표준 라이브러리를 사용하면 UTC를 표준 시간대로 훨씬 쉽게 지정할 수 있습니다.

>>> import datetime
>>> datetime.datetime.now(datetime.timezone.utc)
datetime.datetime(2020, 11, 27, 14, 34, 34, 74823, tzinfo=datetime.timezone.utc)

를 사용하여 로컬 시간 오프셋을 포함하는 날짜 시간을 얻을 수도 있습니다.

>>> datetime.datetime.now(datetime.timezone.utc).astimezone()
datetime.datetime(2020, 11, 27, 15, 34, 34, 74823, tzinfo=datetime.timezone(datetime.timedelta(seconds=3600), 'CET'))

3과 같이할 수 있습니다.datetime.datetime.now().astimezone())

표준 라이브러리만 사용하고 Python 2와 Python 3 모두에서 작동하는 솔루션을 원한다면 jfs의 답변을 참조하십시오.

3.의 경우: Python 3.9+의 경우:zoneinfoIANA:

Python 3.9에서는 표준 라이브러리를 사용하여 다음과 같이 특정 시간대를 지정할 수 있습니다.

>>> from zoneinfo import ZoneInfo
>>> datetime.datetime.now(ZoneInfo("America/Los_Angeles"))
datetime.datetime(2020, 11, 27, 6, 34, 34, 74823, tzinfo=zoneinfo.ZoneInfo(key='America/Los_Angeles'))

zoneinfo는, operating system으로부터 타임 존의 데이타베이스를 취득하거나, 있는 경우는 퍼스트 파티의 PyPI 패키지에서 취득합니다.

표준 라이브러리만 사용하는 원라이너는 Python 3.3부터 작동합니다.을 인식할 수 .datetime오브젝트(johnchen902에 의해 제안됨):

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'))

다음은 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 오프셋이 있는 시간대의 자정을 얻는 것은 더 복잡합니다.

현재 시간을 나타내는 표준 시간대 대응 datetime 개체를 구성하는 다른 방법:

import datetime
import pytz

pytz.utc.localize( datetime.datetime.utcnow() )  

다음을 실행하여 PyPI에서 설치할 수 있습니다.

$ pipenv install pytz

시간대를 인식하는 Python datetime.datetime.now()의 설명에 따라 dateutil을 사용합니다.

from dateutil.tz import tzlocal
# Get the current date/time with the timezone.
now = datetime.datetime.now(tzlocal())

Django를 사용하는 경우 tz를 인식하지 않는 날짜를 설정할 수 있습니다(UTC만).

설정에서 다음 행을 코멘트합니다.py:

USE_TZ = True

stdlib을 사용하여 생성하는 방법은 다음과 같습니다.

import time
from datetime import datetime

FORMAT='%Y-%m-%dT%H:%M:%S%z'
date=datetime.strptime(time.strftime(FORMAT, time.localtime()),FORMAT)

date는 UTC 타임존의 날짜가 아닌 로컬 날짜와 UTC로부터의 오프셋을 저장하기 때문에 날짜가 생성되는 시간대를 특정해야 할 경우 이 솔루션을 사용할 수 있습니다.다음 예시와 로컬 시간대:

date
datetime.datetime(2017, 8, 1, 12, 15, 44, tzinfo=datetime.timezone(datetime.timedelta(0, 7200)))

date.tzname()
'UTC+02:00'

가 되는 것은 '''를 입니다.%zFORMAT에 지시하여 생성된 시간 구조의 UTC 오프셋을 나타냅니다.기타 표현 형식은 datetime 모듈 문서에서 참조할 수 있습니다.

UTC 시간대의 날짜가 필요한 경우 time.localtime()을 time.gmtime()으로 대체할 수 있습니다.

date=datetime.strptime(time.strftime(FORMAT, time.gmtime()),FORMAT)

date    
datetime.datetime(2017, 8, 1, 10, 23, 51, tzinfo=datetime.timezone.utc)

date.tzname()
'UTC'

편집

이것은 python3에서만 동작합니다.z 지시어는 python 2 _strptime에서는 사용할 수 없습니다.py 코드

pytz는 Python 2.3 이상을 사용하여 플랫폼 간 시간대를 정확하게 계산할 수 있는 Python 라이브러리입니다.

stdlib에서는 이것이 불가능합니다.

SO에 대한 유사한 질문을 참조하십시오.

Python 3.6 이후로는 표준 lib만 있으면 로컬 시간(OS 설정)을 나타내는 시간대 인식 datetime 개체를 얻을 수 있다는 점을 강조해야 합니다.astimezone() 사용

import datetime

datetime.datetime(2010, 12, 25, 10, 59).astimezone()
# e.g.
# datetime.datetime(2010, 12, 25, 10, 59, tzinfo=datetime.timezone(datetime.timedelta(seconds=3600), 'Mitteleuropäische Zeit'))

datetime.datetime(2010, 12, 25, 12, 59).astimezone().isoformat()
# e.g.
# '2010-12-25T12:59:00+01:00'

# I'm on CET/CEST

(@johnchen902 코멘트 참조).단, astimezone(None)은 DST를 인식하지 않고 인식된 날짜/시간을 제공합니다.

다음은 today()와 연동되는 판독 가능한 시간대를 사용하는 솔루션입니다.

from pytz import timezone

datetime.now(timezone('Europe/Berlin'))
datetime.now(timezone('Europe/Berlin')).today()

다음과 같이 모든 타임존을 나열할 수 있습니다.

import pytz

pytz.all_timezones
pytz.common_timezones # or

표준 시간대 인식 날짜 가져오기utctimezone은 날짜 감산이 작동하기에 충분합니다.

하지만 현재 시간대에 시간대 인식 날짜를 지정하려면tzlocal이 방법은 다음과 같습니다.

from tzlocal import get_localzone  # pip install tzlocal
from datetime import datetime
datetime.now(get_localzone())

PSdateutil같은 기능을 가지고 있다(dateutil.tz.tzlocal그러나 이름을 공유하는 영감은 J.F.에 의해 지적된 과 같이 완전히 다른 코드 베이스를 가지고 있습니다.세바스찬은 잘못된 결과를 줄 수 있다.

또 다른 대안은, 내 생각에, 더 나은 방법은,Pendulum대신pytz. 다음의 간단한 코드를 고려합니다.

>>> import pendulum

>>> dt = pendulum.now().to_iso8601_string()
>>> print (dt)
2018-03-27T13:59:49+03:00
>>>

펜듈럼을 설치하고 설명서를 보려면 여기를 클릭하십시오.심플한 ISO8601, RFC3339 등 많은 포맷 지원 옵션을 갖추고 있어 퍼포먼스가 향상되고 보다 심플한 코드가 생성되는 경향이 있습니다.

특히 UTC 이외의 타임존의 경우:

독자적인 방법을 가진 유일한 타임존은timezone.utc단, 필요에 따라 UTC 오프셋을 사용하여 타임존을 조작할 수 있습니다.timedelta&timezone를 사용하여 .replace.

In [1]: from datetime import datetime, timezone, timedelta

In [2]: def force_timezone(dt, utc_offset=0):
   ...:     return dt.replace(tzinfo=timezone(timedelta(hours=utc_offset)))
   ...:

In [3]: dt = datetime(2011,8,15,8,15,12,0)

In [4]: str(dt)
Out[4]: '2011-08-15 08:15:12'

In [5]: str(force_timezone(dt, -8))
Out[5]: '2011-08-15 08:15:12-08:00'

「」를 사용합니다.timezone(timedelta(hours=n))타임존이 진짜 은빛 총알이고 다른 많은 유용한 응용 프로그램들이 있기 때문입니다.

'howchoo'의 Tyler는 Datetime Objects에 대한 더 나은 아이디어를 얻을 수 있도록 정말 훌륭한 기사를 작성했습니다.아래 링크

Datetime 관련 작업

기본적으로 다음 항목을 두 날짜/시간 객체의 끝에 추가했습니다.

.replace(tzinfo=pytz.utc)

예:

import pytz
import datetime from datetime

date = datetime.now().replace(tzinfo=pytz.utc)

현재 시각과 날짜를 python으로 취득하면 다음과 같은 현재 시각과 날짜를 취득한 후 python으로 Import date and time, pyz 패키지를 python으로 Import합니다.

from datetime import datetime
import pytz
import time
str(datetime.strftime(datetime.now(pytz.utc),"%Y-%m-%d %H:%M:%S%t"))

시간대 인식 날짜 시간에는 다음과 같이 시간대를 사용합니다.기본값은 UTC 입니다.

from django.utils import timezone
today = timezone.now()

pnp_datetime을 시도합니다.사용되고 반환된 모든 시간은 타임존과 함께이며 오프셋 지연 및 오프셋 인식 문제는 발생하지 않습니다.

>>> from pnp_datetime.pnp_datetime import Pnp_Datetime
>>>
>>> Pnp_Datetime.utcnow()
datetime.datetime(2020, 6, 5, 12, 26, 18, 958779, tzinfo=<UTC>)

언급URL : https://stackoverflow.com/questions/4530069/how-do-i-get-a-value-of-datetime-today-in-python-that-is-timezone-aware