UTC datetime 문자열을 로컬 datetime으로 변환
나는 UTC로 시간을 전환해 본 적이 없다.최근에 내 앱을 시간대별로 인식시켜 달라는 요청이 있었는데, 나는 계속 동그라미를 치고 있어.현지 시간을 UTC로 전환하는 것에 관한 많은 정보들이 내가 상당히 초보적이라고 생각했지만, UTC 시간을 최종 사용자 시간대로 쉽게 변환하는 것에 대한 정보는 찾을 수 없다.
간단히 말해 안드로이드 앱이 나에게 (애플엔진 앱) 데이터를 보내고 그 데이터 안에 타임스탬프가 있다.사용 중인 UTC 시간에 타임스탬프를 저장하려면:
datetime.utcfromtimestamp(timestamp)
효과가 있는 것 같아.내 앱이 데이터를 저장하면 5시간 전에 저장된다(I am EST -5)
이 데이터는 앱엔진의 BigTable에 저장되고 있으며, 검색하면 다음과 같은 문자열로 나온다.
"2011-01-21 02:37:21"
올바른 시간대에서 이 문자열을 날짜 시간으로 변환하려면 어떻게 해야 하는가?
또한 사용자 시간대 정보를 저장할 때 권장되는 스토리지는 무엇인가?(tz 정보(예: "-5:00" 또는 "EST" 등)를 어떻게 저장하십니까?내 첫 번째 질문에 대한 대답은 두 번째 질문에 대한 대답을 매개 변수를 포함할 것이라고 확신한다.
만약 당신이 당신만의 것을 제공하기를 원하지 않는다면.tzinfo
개체, python-dateutil 라이브러리를 확인하십시오.그것은 제공한다.tzinfo
다소 표준적인 이름으로 표준 시간대 규칙을 참조할 수 있는 구역 정보(Olson) 데이터베이스 위에 구현.
from datetime import datetime
from dateutil import tz
# METHOD 1: Hardcode zones:
from_zone = tz.gettz('UTC')
to_zone = tz.gettz('America/New_York')
# METHOD 2: Auto-detect zones:
from_zone = tz.tzutc()
to_zone = tz.tzlocal()
# utc = datetime.utcnow()
utc = datetime.strptime('2011-01-21 02:37:21', '%Y-%m-%d %H:%M:%S')
# Tell the datetime object that it's in UTC time zone since
# datetime objects are 'naive' by default
utc = utc.replace(tzinfo=from_zone)
# Convert time zone
central = utc.astimezone(to_zone)
표시할 확장 예제 편집strptime
사용법
2 고정 API 사용법을 편집하여 더 나은 진입점 방법을 표시
편집 3 시간대에 대한 자동 검색 방법 포함(야린)
외부 라이브러리에 의존하지 않는 복원력 있는 방법은 다음과 같다.
from datetime import datetime
import time
def datetime_from_utc_to_local(utc_datetime):
now_timestamp = time.time()
offset = datetime.fromtimestamp(now_timestamp) - datetime.utcfromtimestamp(now_timestamp)
return utc_datetime + offset
이것은 DelboyJay의 예에서 타이밍 이슈를 피한다.그리고 에릭 반 우스틴의 수정안에 있는 덜 시기적인 문제들.
흥미로운 각주로서 위에서 계산한 시간대 오프셋은 일광 절약 규칙의 변경으로 인해 다음과 같은 겉으로 보기에 동등한 표현식과 다를 수 있다.
offset = datetime.fromtimestamp(0) - datetime.utcfromtimestamp(0) # NO!
업데이트: 이 코드 조각은 입력 datetime의 UTC 오프셋과 다를 수 있는 현재 시간의 UTC 오프셋을 사용하는 약점이 있다.다른 솔루션은 이 답변에 대한 설명을 참조하십시오.
다른 시대를 헤쳐 나가려면, 지나간 시간부터 신기원을 이루는 시간을 잡아라.내가 하는 일은 다음과 같다.
def utc2local(utc):
epoch = time.mktime(utc.timetuple())
offset = datetime.fromtimestamp(epoch) - datetime.utcfromtimestamp(epoch)
return utc + offset
tzinfo 개체에 대한 날짜/시간 설명서를 참조하십시오.스스로 지탱하고 싶은 시간대를 구현해야 한다.문서 하단의 예는 다음과 같다.
여기 간단한 예가 있다.
from datetime import datetime,tzinfo,timedelta
class Zone(tzinfo):
def __init__(self,offset,isdst,name):
self.offset = offset
self.isdst = isdst
self.name = name
def utcoffset(self, dt):
return timedelta(hours=self.offset) + self.dst(dt)
def dst(self, dt):
return timedelta(hours=1) if self.isdst else timedelta(0)
def tzname(self,dt):
return self.name
GMT = Zone(0,False,'GMT')
EST = Zone(-5,False,'EST')
print datetime.utcnow().strftime('%m/%d/%Y %H:%M:%S %Z')
print datetime.now(GMT).strftime('%m/%d/%Y %H:%M:%S %Z')
print datetime.now(EST).strftime('%m/%d/%Y %H:%M:%S %Z')
t = datetime.strptime('2011-01-21 02:37:21','%Y-%m-%d %H:%M:%S')
t = t.replace(tzinfo=GMT)
print t
print t.astimezone(EST)
출력
01/22/2011 21:52:09
01/22/2011 21:52:09 GMT
01/22/2011 16:52:09 EST
2011-01-21 02:37:21+00:00
2011-01-20 21:37:21-05:00a
모호한 현지 시간(예: DST 전환 중) 및/또는 로컬 utc 오프셋이 로컬 표준 시간대에서 서로 다른 시간 동안에도 올바른 결과를 얻으려면pytz
시간 범위:
#!/usr/bin/env python
from datetime import datetime
import pytz # $ pip install pytz
import tzlocal # $ pip install tzlocal
local_timezone = tzlocal.get_localzone() # get pytz tzinfo
utc_time = datetime.strptime("2011-01-21 02:37:21", "%Y-%m-%d %H:%M:%S")
local_time = utc_time.replace(tzinfo=pytz.utc).astimezone(local_timezone)
이 답은 만약 당신이 다른 모듈들을 사용하고 싶지 않다면 도움이 될 것이다.datetime
.
datetime.utcfromtimestamp(timestamp)
천진난만한 것을 답례하다.datetime
(는) 를 알고 , 은 시간대를 알고 있다아는 사람은 시간대를 알고 있고, 순진한 사람은 그렇지 않다.시간 범위(예: UTC와 현지 시간 간) 간에 변환하려는 경우 인식된 시간 표시
만약 당신이 날짜를 먼저 암시하는 사람이 아니라면, 당신은 여전히 순진한 것을 창조할 수 있다.datetime
UTC 시간 내에 객체를 변환하기 위해 이 Python 3.x 코드를 사용해 보십시오.
import datetime
d=datetime.datetime.strptime("2011-01-21 02:37:21", "%Y-%m-%d %H:%M:%S") #Get your naive datetime object
d=d.replace(tzinfo=datetime.timezone.utc) #Convert it to an aware datetime object in UTC time.
d=d.astimezone() #Convert it to your local timezone (still aware)
print(d.strftime("%d %b %Y (%I:%M:%S:%f %p) %Z")) #Print it with a directive of choice
현재 시간대가 MDT인 경우 일광 절약 시간이 MST를 인쇄하기 때문에 위의 코드와 함께 작동하지 않는다고 잘못 가정하지 않도록 주의하십시오. 월을 8월로 변경하면 MDT가 인쇄된다는 점에 유의하십시오.
인지할 수 있는 또 다른 쉬운 방법datetime
개체(Python 3.x에서도)는 시작하도록 지정된 시간대로 개체를 만드는 것이다.UTC 사용 예:
import datetime, sys
aware_utc_dt_obj=datetime.datetime.now(datetime.timezone.utc) #create an aware datetime object
dt_obj_local=aware_utc_dt_obj.astimezone() #convert it to local time
#The following section is just code for a directive I made that I liked.
if sys.platform=="win32":
directive="%#d %b %Y (%#I:%M:%S:%f %p) %Z"
else:
directive="%-d %b %Y (%-I:%M:%S:%f %p) %Z"
print(dt_obj_local.strftime(directive))
Python 2.x를 사용하면 아마도 하위 클래스를 사용해야 할 것이다.datetime.tzinfo
그리고 그것을 이용해서 당신이 자각할 수 있도록 도와준다.datetime
그 이후부터의 목적어datetime.timezone
Python 2.x에는 존재하지 않는다.
장고를 사용할 경우 다음과 같은 방법을 사용할 수 있다.
from django.utils import timezone
date
# datetime.datetime(2014, 8, 1, 20, 15, 0, 513000, tzinfo=<UTC>)
timezone.localtime(date)
# datetime.datetime(2014, 8, 1, 16, 15, 0, 513000, tzinfo=<DstTzInfo 'America/New_York' EDT-1 day, 20:00:00 DST>)
미국 서부 지역의 클라우드 환경에서는 다음과 같은 이점을 누릴 수 있었다.
import datetime
import pytz
#set the timezone
tzInfo = pytz.timezone('America/Los_Angeles')
dt = datetime.datetime.now(tz=tzInfo)
print(dt)
화살표를 사용할 수 있다.
from datetime import datetime
import arrow
now = datetime.utcnow()
print(arrow.get(now).to('local').format())
# '2018-04-04 15:59:24+02:00'
너는 먹을 수 있다.arrow.get()
등, ISO 문자표 등
franksands의 답을 편리한 방법으로 통합하는 것.
import calendar
import datetime
def to_local_datetime(utc_dt):
"""
convert from utc datetime to a locally aware datetime according to the host timezone
:param utc_dt: utc datetime
:return: local timezone datetime
"""
return datetime.datetime.fromtimestamp(calendar.timegm(utc_dt.timetuple()))
사용할 수 있다calendar.timegm
및 Unix epoech epoech epoech epo, unix epoech epo, epoech epo, astime.localtime
다시 변환하려면:
import calendar
import time
time_tuple = time.strptime("2011-01-21 02:37:21", "%Y-%m-%d %H:%M:%S")
t = calendar.timegm(time_tuple)
print time.ctime(t)
주다Fri Jan 21 05:37:21 2011
(내가 UTC+03:00 시간대에 있기 때문에).
import datetime
def utc_str_to_local_str(utc_str: str, utc_format: str, local_format: str):
"""
:param utc_str: UTC time string
:param utc_format: format of UTC time string
:param local_format: format of local time string
:return: local time string
"""
temp1 = datetime.datetime.strptime(utc_str, utc_format)
temp2 = temp1.replace(tzinfo=datetime.timezone.utc)
local_time = temp2.astimezone()
return local_time.strftime(local_format)
utc_tz_example_str = '2018-10-17T00:00:00.111Z'
utc_fmt = '%Y-%m-%dT%H:%M:%S.%fZ'
local_fmt = '%Y-%m-%dT%H:%M:%S+08:00'
# call my function here
local_tz_str = utc_str_to_local_str(utc_tz_example_str, utc_fmt, local_fmt)
print(local_tz_str) # 2018-10-17T08:00:00+08:00
시 시 시 시utc_tz_example_str
= 2018-10-17T00:00:00.1111Z, (UTC +00:00:00)
그럼 내가 받을게.local_tz_str
= 2018-10-17T08:00:00+08:00 나의 목표 시간대 +08:00)
매개 변수utc_format
특정 형식에 의해 결정되는 형식임utc_tz_example_str
.
매개 변수local_fmt
최종 원하는 형식이다.
나의 경우 원하는 형식은%Y-%m-%dT%H:%M:%S+08:00
( +08:00 표준시).원하는 형식을 구성해야 한다.
나는 전통적으로 이것을 프런트엔드로 연기한다. -- 백엔드에서 시간을 타임스탬프 또는 UTC의 다른 날짜/시간 형식으로 보내고, 그리고 나서 클라이언트가 표준 시간대 오프셋을 파악하여 이 데이터를 적절한 시간대로 렌더링하도록 한다.
웹앱의 경우, 이것은 자바스크립트로 하는 것이 꽤 쉽다. 내장된 방법을 사용하여 브라우저의 시간대 오프셋을 꽤 쉽게 알아낸 다음, 백엔드에서 데이터를 적절하게 렌더링할 수 있다.
여기의 답변에서 시간 모듈을 사용하여 utc에서 컴퓨터에 설정된 로컬 시간으로 변환할 수 있다.
utc_time = time.strptime("2018-12-13T10:32:00.000", "%Y-%m-%dT%H:%M:%S.%f")
utc_seconds = calendar.timegm(utc_time)
local_time = time.localtime(utc_seconds)
시차를 해결하기 위해 로컬 시스템 설정을 사용하는 빠르고 더러운 버전이 여기에 있다.참고: 현재 시스템이 실행되고 있지 않은 표준 시간대로 변환해야 하는 경우 이 작업은 작동하지 않음.나는 이것을 BST 시간대 하의 영국 설정으로 테스트했다.
from datetime import datetime
def ConvertP4DateTimeToLocal(timestampValue):
assert isinstance(timestampValue, int)
# get the UTC time from the timestamp integer value.
d = datetime.utcfromtimestamp( timestampValue )
# calculate time difference from utcnow and the local system time reported by OS
offset = datetime.now() - datetime.utcnow()
# Add offset to UTC time and return it
return d + offset
이 일은 내게 효과가 있었다.
from django.utils import timezone
from datetime import timedelta,datetime
ist_time = timezone.now() + timedelta(hours=5,minutes=30)
#second method
ist_time = datetime.now() + timedelta(hours=5,minutes=30)
간단하고 간단함:
from datetime import datetime
t = "2011-01-21 02:37:21"
datetime.fromisoformat(t) + (datetime.now() - datetime.utcnow())
참조URL: https://stackoverflow.com/questions/4770297/convert-utc-datetime-string-to-local-datetime
'IT이야기' 카테고리의 다른 글
'제안' 변경사항을 청취하는 방법 (0) | 2022.03.09 |
---|---|
Nuxt 저장소를 모듈 모드로 이동하면 'Getter is function' 오류가 발생함 (0) | 2022.03.09 |
vue-무한 로드 요소를 재설정하는 방법? (0) | 2022.03.09 |
react-native에서 'No bundle URL no present'의 의미는 무엇인가? (0) | 2022.03.09 |
문자열 변수로 텍스트 파일을 읽고 새 줄을 분리하는 방법 (0) | 2022.03.09 |