Python 시간대 변환
파이썬에서 시간을 다른 시간대로 변환하려면 어떻게 해야 합니까?
가장 좋은 접근 방식은 관심 "모멘트"를 UTC 시간대 인식 날짜대 객체로 변환하는 것입니다(파이썬에서는 날짜대 객체에 시간대 구성 요소가 필요하지 않음).
그런 다음 표준 시간대를 사용하여 관심 시간대(기준)로 변환할 수 있습니다.
from datetime import datetime
import pytz
utcmoment_naive = datetime.utcnow()
utcmoment = utcmoment_naive.replace(tzinfo=pytz.utc)
# print "utcmoment_naive: {0}".format(utcmoment_naive) # python 2
print("utcmoment_naive: {0}".format(utcmoment_naive))
print("utcmoment: {0}".format(utcmoment))
localFormat = "%Y-%m-%d %H:%M:%S"
timezones = ['America/Los_Angeles', 'Europe/Madrid', 'America/Puerto_Rico']
for tz in timezones:
localDatetime = utcmoment.astimezone(pytz.timezone(tz))
print(localDatetime.strftime(localFormat))
# utcmoment_naive: 2017-05-11 17:43:30.802644
# utcmoment: 2017-05-11 17:43:30.802644+00:00
# 2017-05-11 10:43:30
# 2017-05-11 19:43:30
# 2017-05-11 13:43:30
따라서 로컬 시간대(존재하는 시간)에 관심이 있는 순간을 사용하여 이를 UTC로 변환합니다(참조).
localmoment_naive = datetime.strptime('2013-09-06 14:05:10', localFormat)
localtimezone = pytz.timezone('Australia/Adelaide')
try:
localmoment = localtimezone.localize(localmoment_naive, is_dst=None)
print("Time exists")
utcmoment = localmoment.astimezone(pytz.utc)
except pytz.exceptions.NonExistentTimeError as e:
print("NonExistentTimeError")
피츠 사용
from datetime import datetime
from pytz import timezone
fmt = "%Y-%m-%d %H:%M:%S %Z%z"
timezonelist = ['UTC','US/Pacific','Europe/Berlin']
for zone in timezonelist:
now_time = datetime.now(timezone(zone))
print now_time.strftime(fmt)
Python 3.9는 모듈을 추가하므로 이제 표준 라이브러리만 필요합니다!
>>> from zoneinfo import ZoneInfo
>>> from datetime import datetime
>>> d = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo('America/Los_Angeles'))
>>> d.astimezone(ZoneInfo('Europe/Berlin')) # 12:00 in Cali will be 20:00 in Berlin
datetime.datetime(2020, 10, 31, 20, 0, tzinfo=zoneinfo.ZoneInfo(key='Europe/Berlin'))
다음과 같은 일부 기능now()
그리고.utcnow()
표준 시간대에 지정된 날짜 시간을 반환합니다. 즉, 표준 시간대 정보가 포함되어 있지 않습니다.키워드를 사용하여 시간대 인식 값만 요청하는 것이 좋습니다.tz=ZoneInfo('localtime')
.
한다면astimezone
시간대를 초과하는 입력을 가져오면 현지 시간으로 가정하여 다음 오류가 발생할 수 있습니다.
>>> datetime.utcnow() # UTC -- NOT timezone-aware!!
datetime.datetime(2020, 6, 1, 22, 39, 57, 376479)
>>> datetime.now() # Local time -- NOT timezone-aware!!
datetime.datetime(2020, 6, 2, 0, 39, 57, 376675)
>>> datetime.now(tz=ZoneInfo('localtime')) # timezone-aware
datetime.datetime(2020, 6, 2, 0, 39, 57, 376806, tzinfo=zoneinfo.ZoneInfo(key='localtime'))
>>> datetime.now(tz=ZoneInfo('Europe/Berlin')) # timezone-aware
datetime.datetime(2020, 6, 2, 0, 39, 57, 376937, tzinfo=zoneinfo.ZoneInfo(key='Europe/Berlin'))
>>> datetime.utcnow().astimezone(ZoneInfo('Europe/Berlin')) # WRONG!!
datetime.datetime(2020, 6, 1, 22, 39, 57, 377562, tzinfo=zoneinfo.ZoneInfo(key='Europe/Berlin'))
Windows에는 시스템 표준 시간대 데이터베이스가 없으므로 여기에는 추가 패키지가 필요합니다.
pip install tzdata
Python 3.6에서 3.8까지 사용할 수 있는 백포트가 있습니다.
sudo pip install backports.zoneinfo
그러면:
from backports.zoneinfo import ZoneInfo
import datetime
import pytz
def convert_datetime_timezone(dt, tz1, tz2):
tz1 = pytz.timezone(tz1)
tz2 = pytz.timezone(tz2)
dt = datetime.datetime.strptime(dt,"%Y-%m-%d %H:%M:%S")
dt = tz1.localize(dt)
dt = dt.astimezone(tz2)
dt = dt.strftime("%Y-%m-%d %H:%M:%S")
return dt
-
dt
날짜 시간 문자열tz1
초기 시간대tz2
목표 시간대
-
> convert_datetime_timezone("2017-05-13 14:56:32", "Europe/Berlin", "PST8PDT")
'2017-05-13 05:56:32'
> convert_datetime_timezone("2017-05-13 14:56:32", "Europe/Berlin", "UTC")
'2017-05-13 12:56:32'
-
> pytz.all_timezones[0:10]
['Africa/Abidjan',
'Africa/Accra',
'Africa/Addis_Ababa',
'Africa/Algiers',
'Africa/Asmara',
'Africa/Asmera',
'Africa/Bamako',
'Africa/Bangui',
'Africa/Banjul',
'Africa/Bissau']
시간 변환
Python에서 한 시간대의 시간을 다른 시간대로 변환하려면 datetime.astimezone():
그래서, 아래 코드는 현지 시간을 다른 시간대로 변환하는 것입니다.
- datetime.datetime.today(오늘) - 현지 시간으로 전류를 반환
- datetime.astimezone() - 표준 시간대를 변환하지만 표준 시간대를 통과해야 합니다.
- pytz.timezone('Asia/Kolkata') - 시간대를 pytz 모듈로 전달
- Strftime - Datetime을 문자열로 변환
# Time conversion from local time
import datetime
import pytz
dt_today = datetime.datetime.today() # Local time
dt_India = dt_today.astimezone(pytz.timezone('Asia/Kolkata'))
dt_London = dt_today.astimezone(pytz.timezone('Europe/London'))
India = (dt_India.strftime('%m/%d/%Y %H:%M'))
London = (dt_London.strftime('%m/%d/%Y %H:%M'))
print("Indian standard time: "+India+" IST")
print("British Summer Time: "+London+" BST")
모든 표준시 나열
import pytz
for tz in pytz.all_timezones:
print(tz)
파이썬에서 한 시간대의 시간을 다른 시간대로 변환하려면 다음을 사용할 수 있습니다.
time_in_new_timezone = time_in_old_timezone.astimezone(new_timezone)
정해진aware_dt
(a)datetime
일부 시간대의 객체)를 다른 시간대로 변환하고 지정된 시간 형식으로 시간을 인쇄합니다.
#!/usr/bin/env python3
import pytz # $ pip install pytz
time_format = "%Y-%m-%d %H:%M:%S%z"
tzids = ['Asia/Shanghai', 'Europe/London', 'America/New_York']
for tz in map(pytz.timezone, tzids):
time_in_tz = aware_dt.astimezone(tz)
print(f"{time_in_tz:{time_format}}")
한다면f""
구문을 사용할 수 없습니다. 구문을 다음으로 바꿀 수 있습니다."".format(**vars())
설정할 수 있는 위치aware_dt
로컬 시간대의 현재 시간부터:
from datetime import datetime
import tzlocal # $ pip install tzlocal
local_timezone = tzlocal.get_localzone()
aware_dt = datetime.now(local_timezone) # the current time
또는 로컬 시간대의 입력 시간 문자열에서:
naive_dt = datetime.strptime(time_string, time_format)
aware_dt = local_timezone.localize(naive_dt, is_dst=None)
어디에time_string
다음과 같이 표시될 수 있습니다.'2016-11-19 02:21:42'
에 해당합니다.time_format = '%Y-%m-%d %H:%M:%S'
.
is_dst=None
입력 시간 문자열이 DST 전환 중과 같이 존재하지 않거나 모호한 로컬 시간에 해당하는 경우에는 예외를 적용합니다.당신은 또한 통과할 수 있습니다.is_dst=False
,is_dst=True
Python에서 자세한 내용은 다음 링크를 참조하십시오. 날짜/시간 스탬프를 한 시간대에서 다른 시간대로 어떻게 변환합니까?
Python 시간대 변환의 경우 Taavi Burns의 PyCon 2012 프레젠테이션의 핸디 테이블을 사용합니다.
참고:이 답변의 첫 번째 부분은 또는 진자 버전 1.x입니다.버전 2.x 답변은 아래를 참조하십시오.
너무 늦지 않았으면 좋겠어요!
진자 라이브러리는 이것과 다른 날짜-시간 계산에 탁월합니다.
>>> import pendulum
>>> some_time_zones = ['Europe/Paris', 'Europe/Moscow', 'America/Toronto', 'UTC', 'Canada/Pacific', 'Asia/Macao']
>>> heres_a_time = '1996-03-25 12:03 -0400'
>>> pendulum_time = pendulum.datetime.strptime(heres_a_time, '%Y-%m-%d %H:%M %z')
>>> for tz in some_time_zones:
... tz, pendulum_time.astimezone(tz)
...
('Europe/Paris', <Pendulum [1996-03-25T17:03:00+01:00]>)
('Europe/Moscow', <Pendulum [1996-03-25T19:03:00+03:00]>)
('America/Toronto', <Pendulum [1996-03-25T11:03:00-05:00]>)
('UTC', <Pendulum [1996-03-25T16:03:00+00:00]>)
('Canada/Pacific', <Pendulum [1996-03-25T08:03:00-08:00]>)
('Asia/Macao', <Pendulum [1996-03-26T00:03:00+08:00]>)
응답에는 진자와 함께 사용할 수 있는 시간대의 이름이 나열됩니다.(피츠와 동일합니다.)
버전 2의 경우:
some_time_zones
할 수 입니다.heres_a_time
는 샘플 '- '-0400' 로 완료되었습니다.- 나는 시간을 후속 처리를 위한 진자 시간으로 변환하는 것으로 시작합니다.
- 이제각시대에서이시무수보있다습니여줄지엇인간이간▁of▁의 각 시간대에서 이 수 .
show_time_zones
...
>>> import pendulum
>>> some_time_zones = ['Europe/Paris', 'Europe/Moscow', 'America/Toronto', 'UTC', 'Canada/Pacific', 'Asia/Macao']
>>> heres_a_time = '1996-03-25 12:03 -0400'
>>> pendulum_time = pendulum.from_format('1996-03-25 12:03 -0400', 'YYYY-MM-DD hh:mm ZZ')
>>> for tz in some_time_zones:
... tz, pendulum_time.in_tz(tz)
...
('Europe/Paris', DateTime(1996, 3, 25, 17, 3, 0, tzinfo=Timezone('Europe/Paris')))
('Europe/Moscow', DateTime(1996, 3, 25, 19, 3, 0, tzinfo=Timezone('Europe/Moscow')))
('America/Toronto', DateTime(1996, 3, 25, 11, 3, 0, tzinfo=Timezone('America/Toronto')))
('UTC', DateTime(1996, 3, 25, 16, 3, 0, tzinfo=Timezone('UTC')))
('Canada/Pacific', DateTime(1996, 3, 25, 8, 3, 0, tzinfo=Timezone('Canada/Pacific')))
('Asia/Macao', DateTime(1996, 3, 26, 0, 3, 0, tzinfo=Timezone('Asia/Macao')))
Python 3.2+의 경우 simple-date는 사물을 단순화하려고 하는 pytz 주변의 래퍼입니다.
만약 당신이 가지고 있다면.time
그리고나서
SimpleDate(time).convert(tz="...")
당신이 원하는 것을 할 수 있습니다.그러나 시간대는 상당히 복잡한 것이기 때문에 훨씬 더 복잡해질 수 있습니다. 문서를 참조하십시오.
# Program
import time
import os
os.environ['TZ'] = 'US/Eastern'
time.tzset()
print('US/Eastern in string form:',time.asctime())
os.environ['TZ'] = 'Australia/Melbourne'
time.tzset()
print('Australia/Melbourne in string form:',time.asctime())
os.environ['TZ'] = 'Asia/Kolkata'
time.tzset()
print('Asia/Kolkata in string form:',time.asctime())
언급URL : https://stackoverflow.com/questions/10997577/python-timezone-conversion
'sourcecode' 카테고리의 다른 글
구조체 끝의 크기가 0인 배열 (0) | 2023.08.06 |
---|---|
빠르게 원을 그리며 이미지를 설정하는 방법 (0) | 2023.08.06 |
충돌:여러 자산이 동일한 파일 이름으로 방출됨 (0) | 2023.08.01 |
AJAX에서 GET vs POST? (0) | 2023.08.01 |
라라벨 웅변가 관계 가져오기 카운트 (0) | 2023.08.01 |