어떻게 datetime 현지 시간의 문자열string in UTC time로 변환합니까?
전에도 해본 적이 있지만 찾을 수는 없지만 SO 앞으로 나에게 (그리고 다른 사람들이) 도움이 될 것으로 기대합니다.
Clarification : 예를 들어, 현지 시간대 (2008-09-17 14:02:00
)에 +10
가있는 경우 해당 UTC
시간 문자열을 생성하고 싶습니다. 2008-09-17 04:02:00
.
또한 http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/ 에서 DST 및 기타 문제가있는 경우 일반적으로 불가능합니다. 현지 시간에서 UTC 시간으로의 고유 변환이 없습니다.
@rofly, 문자열에서 문자열로의 완전한 변환은 다음과 같습니다.
time.strftime("%Y-%m-%d %H:%M:%S",
time.gmtime(time.mktime(time.strptime("2008-09-17 14:04:00",
"%Y-%m-%d %H:%M:%S"))))
time
/calendar
함수 요약 :
time.strptime
string -> Tuple (타임 존이 적용되지 않았으므로 문자열과 일치합니다)
time.mktime
현지 시간 Tuple -> Epoch 이후의 시간 (항상 현지 시간)
time.gmtime
Epoch 이후의 초 -> 튜플 (UTC)
과
calendar.timegm
Tuple in UTC -> Epoch 이후 초 단위
time.localtime
Epoch 이후의 초 -> 현지 시간대의 튜플
먼저 문자열을 순진한 datetime 객체로 파싱합니다. 이것은 시간대 정보가 첨부되지 않은 datetime.datetime
의 인스턴스입니다. 날짜 문자열의 구문 분석에 대한 정보는 datetime.strptime
에 대한 설명서를 참조하십시오.
시간대 + UTC의 전체 목록과 함께 제공되는 pytz
모듈을 사용하십시오. 로컬 타임 존이 무엇인지 파악하고, 타임 존 객체를 생성 한 다음,이를 순조로운 datetime에 조작하고 첨부하십시오.
마지막으로 datetime.astimezone()
메서드를 사용하여 datetime을 UTC로 변환합니다.
"2001-2-3 10:11:12"문자열의 현지 시간대 "America/Los_Angeles"를 사용하는 소스 코드 :
import pytz, datetime
local = pytz.timezone ("America/Los_Angeles")
naive = datetime.datetime.strptime ("2001-2-3 10:11:12", "%Y-%m-%d %H:%M:%S")
local_dt = local.localize(naive, is_dst=None)
utc_dt = local_dt.astimezone(pytz.utc)
거기에서 strftime()
메서드를 사용하여 필요에 따라 UTC datetime의 형식을 지정할 수 있습니다.
utc_dt.strftime ("%Y-%m-%d %H:%M:%S")
Datetime 모듈의 utcnow () 함수를 사용하여 현재 UTC 시간을 얻을 수 있습니다.
>>> import datetime
>>> utc_datetime = datetime.datetime.utcnow()
>>> utc_datetime.strftime("%Y-%m-%d %H:%M:%S")
'2010-02-01 06:59:19'
위에서 언급 한 Tom의 링크 : http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/ 라고 써 있습니다.
UTC는 일광 절약 시간제가없는 표준 시간대이며 과거에는 구성이 변경되지 않은 표준 시간대입니다.
항상 UTC로 측정하고 저장하는 시간 .
시간이 찍힌 곳을 기록해야 할 경우 별도로 저장하십시오.하지 마라 로컬 타임 + 타임 존 정보를 저장하라!
NOTE- DST를 사용하는 지역에있는 데이터가 있으면 pytz
을 사용하고 John Millikin의 답변을 살펴보십시오.
주어진 문자열에서 UTC 시간을 얻고 DST를 사용하지 않는 세계의 지역에있을만큼 운이 좋거나 DST가 적용되지 않은 UTC에서 오프셋 된 데이터 만 있다면 :
-> 현지 시간을 오프셋 값의 기초로 사용 :
>>> # Obtain the UTC Offset for the current system:
>>> UTC_OFFSET_TIMEDELTA = datetime.datetime.utcnow() - datetime.datetime.now()
>>> local_datetime = datetime.datetime.strptime("2008-09-17 14:04:00", "%Y-%m-%d %H:%M:%S")
>>> result_utc_datetime = local_datetime + UTC_OFFSET_TIMEDELTA
>>> result_utc_datetime.strftime("%Y-%m-%d %H:%M:%S")
'2008-09-17 04:04:00'
-> 또는 알려진 오프셋에서 datetime.timedelta () 사용 :
>>> UTC_OFFSET = 10
>>> result_utc_datetime = local_datetime - datetime.timedelta(hours=UTC_OFFSET)
>>> result_utc_datetime.strftime("%Y-%m-%d %H:%M:%S")
'2008-09-17 04:04:00'
최신 정보:
파이썬 3.2 datetime.timezone
가 사용 가능하기 때문에. 아래 명령을 사용하여 시간대 인식 datetime 객체를 생성 할 수 있습니다.
import datetime
timezone_aware_dt = datetime.datetime.now(datetime.timezone.utc)
시간대 변환을 수행 할 준비가되면 다음을 읽으십시오.
다음은 일반적인 Python 시간 변환에 대한 요약입니다.
어떤 메소드는 초의 분수를 버리고 로 표시됩니다. 대신 ts = (d - Epoch) / unit
과 같은 명시적인 수식을 사용할 수 있습니다 (jfs에게 감사함).
calendar.timegm(struct_time)
calendar.timegm(stz.localize(dt, is_dst=None).utctimetuple())
calendar.timegm(dt.utctimetuple())
calendar.timegm(dt.utctimetuple())
time.gmtime(t)
stz.localize(dt, is_dst=None).utctimetuple()
dt.utctimetuple()
dt.utctimetuple()
datetime.fromtimestamp(t, None)
datetime.datetime(struct_time[:6], tzinfo=UTC).astimezone(tz).replace(tzinfo=None)
dt.replace(tzinfo=UTC).astimezone(tz).replace(tzinfo=None)
dt.astimezone(tz).replace(tzinfo=None)
datetime.utcfromtimestamp(t)
datetime.datetime(*struct_time[:6])
stz.localize(dt, is_dst=None).astimezone(UTC).replace(tzinfo=None)
dt.astimezone(UTC).replace(tzinfo=None)
datetime.fromtimestamp(t, tz)
datetime.datetime(struct_time[:6], tzinfo=UTC).astimezone(tz)
stz.localize(dt, is_dst=None)
dt.replace(tzinfo=UTC)
출처 : taaviburns.ca
def local_to_utc(t):
secs = time.mktime(t)
return time.gmtime(secs)
def utc_to_local(t):
secs = calendar.timegm(t)
return time.localtime(secs)
출처 : http://feihonghsu.blogspot.com/2008/02/converting-from-local-time-to-utc.html
예제 사용법 bd808 : 소스가 datetime.datetime
개체 t
이면 다음과 같이 호출하십시오.
local_to_utc(t.timetuple())
저는 행운을 빌고 있습니다 dateutil (다른 관련 질문에 대해서는 SO에서 널리 권장됩니다) :
from datetime import *
from dateutil import *
from dateutil.tz import *
# METHOD 1: Hardcode zones:
utc_zone = tz.gettz('UTC')
local_zone = tz.gettz('America/Chicago')
# METHOD 2: Auto-detect zones:
utc_zone = tz.tzutc()
local_zone = tz.tzlocal()
# Convert time string to datetime
local_time = datetime.strptime("2008-09-17 14:02:00", '%Y-%m-%d %H:%M:%S')
# Tell the datetime object that it's in local time zone since
# datetime objects are 'naive' by default
local_time = local_time.replace(tzinfo=local_zone)
# Convert time to UTC
utc_time = local_time.astimezone(utc_zone)
# Generate UTC time string
utc_string = utc_time.strftime('%Y-%m-%d %H:%M:%S')
(코드는이 답변에서 파생되었습니다 TC datetime 문자열을 로컬 datetime으로 변환 )
Pytz에 대한 예제가 하나 더 있지만 localize ()가 포함되어 있으므로 하루를 절약 할 수 있습니다.
import pytz, datetime
utc = pytz.utc
fmt = '%Y-%m-%d %H:%M:%S'
amsterdam = pytz.timezone('Europe/Amsterdam')
dt = datetime.datetime.strptime("2012-04-06 10:00:00", fmt)
am_dt = amsterdam.localize(dt)
print am_dt.astimezone(utc).strftime(fmt)
'2012-04-06 08:00:00'
나는 가장 성공했다 python-dateutil :
from dateutil import tz
def datetime_to_utc(date):
"""Returns date in UTC w/o tzinfo"""
return date.astimezone(tz.gettz('UTC')).replace(tzinfo=None) if date.tzinfo else date
import time
import datetime
def Local2UTC(LocalTime):
EpochSecond = time.mktime(LocalTime.timetuple())
utcTime = datetime.datetime.utcfromtimestamp(EpochSecond)
return utcTime
>>> LocalTime = datetime.datetime.now()
>>> UTCTime = Local2UTC(LocalTime)
>>> LocalTime.ctime()
'Thu Feb 3 22:33:46 2011'
>>> UTCTime.ctime()
'Fri Feb 4 05:33:46 2011'
datetime.datetime을 선호하는 경우 :
dt = datetime.strptime("2008-09-17 14:04:00","%Y-%m-%d %H:%M:%S")
utc_struct_time = time.gmtime(time.mktime(dt.timetuple()))
utc_dt = datetime.fromtimestamp(time.mktime(utc_struct_time))
print dt.strftime("%Y-%m-%d %H:%M:%S")
당신은 다음과 같이 할 수 있습니다 :
>>> from time import strftime, gmtime, localtime
>>> strftime('%H:%M:%S', gmtime()) #UTC time
>>> strftime('%H:%M:%S', localtime()) # localtime
나는 이것을 이렇게했다 :
>>> utc_delta = datetime.utcnow()-datetime.now()
>>> utc_time = datetime(2008, 9, 17, 14, 2, 0) + utc_delta
>>> print(utc_time)
2008-09-17 19:01:59.999996
당신이 환상적 이길 원한다면 이것을 functor로 바꿀 수 있습니다 :
class to_utc():
utc_delta = datetime.utcnow() - datetime.now()
def __call__(cls, t):
return t + cls.utc_delta
결과:
>>> utc_converter = to_utc()
>>> print(utc_converter(datetime(2008, 9, 17, 14, 2, 0)))
2008-09-17 19:01:59.999996
어때?
time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime(seconds))
seconds가 None
이면 로컬 시간을 UTC 시간으로 변환하고 그렇지 않으면 전달 된 시간을 UTC로 변환합니다.
낮의 절전 등을 위해.
위의 답변 중 특히 나를 도왔습니다. 아래 코드는 GMT에서 작동합니다.
def get_utc_from_local(date_time, local_tz=None):
assert date_time.__class__.__== 'datetime'
if local_tz is None:
local_tz = pytz.timezone(settings.TIME_ZONE) # Django eg, "Europe/London"
local_time = local_tz.normalize(local_tz.localize(date_time))
return local_time.astimezone(pytz.utc)
import pytz
from datetime import datetime
summer_11_am = datetime(2011, 7, 1, 11)
get_utc_from_local(summer_11_am)
>>>datetime.datetime(2011, 7, 1, 10, 0, tzinfo=<UTC>)
winter_11_am = datetime(2011, 11, 11, 11)
get_utc_from_local(winter_11_am)
>>>datetime.datetime(2011, 11, 11, 11, 0, tzinfo=<UTC>)
http://crsmithdev.com/arrow/ 사용
arrowObj = arrow.Arrow.strptime('2017-02-20 10:00:00', '%Y-%m-%d %H:%M:%S' , 'US/Eastern')
arrowObj.to('UTC') or arrowObj.to('local')
이 라이브러리는 삶을 편하게 만듭니다 :)
파이썬 3 :
pip install python-dateutil
from dateutil.parser import tz
mydt.astimezone(tz.gettz('UTC')).replace(tzinfo=None)
나는 다른 질문 여기 에 대한 최고의 답을 찾았습니다. 파이썬 내장 라이브러리 만 사용하기 때문에 로컬 타임 존을 입력 할 필요가 없습니다 (필자의 경우 요구 사항)
import time
import calendar
local_time = time.strptime("2018-12-13T09:32:00.000", "%Y-%m-%dT%H:%M:%S.%f")
local_seconds = time.mktime(local_time)
utc_time = time.gmtime(local_seconds)
나는이 질문이 수색 키워드에 따라서 연결된 질문 대신에 google에서 갑자기 나타나기 때문에 응답을 여기 reposting하고있다.