[python] 현지 시간 문자열을 UTC로 변환하는 방법?

현지 시간 의 날짜 시간 문자열을 UTC 시간문자열 로 어떻게 변환 합니까?

나는 내가 전에 이것을 한 것이 확실하지만 그것을 찾을 수 없으며 그렇게하면 나 (그리고 다른 사람들)가 미래에 그렇게하도록 희망적으로 도울 것입니다.

설명 : 예를 들어 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 시간.



답변

먼저 문자열을 순진한 datetime 객체로 구문 분석합니다. datetime.datetime시간대 정보가 첨부되지 않은 인스턴스입니다 . datetime.strptime날짜 문자열 구문 분석 에 대한 정보는 문서를 참조하십시오 .

pytz표준 시간대 + UTC와 함께 제공 되는 모듈을 사용하십시오 . 현지 시간대가 무엇인지 파악하고 그로부터 시간대 개체를 구성한 후 순진한 날짜 / 시간을 조작 및 첨부합니다.

마지막으로, datetime.astimezone()메소드를 사용 하여 날짜 시간을 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 날짜 시간을 형식화 할 수 있습니다 .

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로 시간을 측정하고 저장하십시오 .

시간이 걸린 곳을 기록해야 할 경우 별도로 보관하십시오.
현지 시간 + 시간대 정보를 저장 하지 마십시오 !

참고 -데이터가 DST를 사용하는 지역에있는 경우 pytzJohn 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사용 가능합니다. 아래 명령을 사용하여 시간대 인식 날짜 시간 객체를 생성 할 수 있습니다.

import datetime

timezone_aware_dt = datetime.datetime.now(datetime.timezone.utc)

시간대 변환을 할 준비가 되었다면 다음을 읽으십시오.

https://medium.com/@eleroy/10-things-you-need-to-know-about-date-and-time-in-python-with-datetime-pytz-dateutil-timedelta-309bfbafb3f7


답변

@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-> 튜플 (시간대가 적용되지 않으므로 문자열과 일치)

time.mktime
현지 시간 튜플-에포크 이후 초 (항상 현지 시간)

time.gmtime
epoch 이후의 초-> UTC

calendar.timegm
에포크 이후 UTC-> 초의 튜플

time.localtime
시대 이후 초-> 현지 시간대의 튜플


답변

일반적인 파이썬 시간 변환에 대한 요약은 다음과 같습니다.

일부 방법은 몇 초 만에 삭제되며 (s) 로 표시됩니다 . ts = (d - epoch) / unit대신 jfs 덕분에 명시 적 수식을 사용할 수 있습니다.

  • struct_time (UTC) → POSIX (s) :
    calendar.timegm(struct_time)
  • 나이브 날짜 시간 (로컬) → POSIX (s) :
    calendar.timegm(stz.localize(dt, is_dst=None).utctimetuple())
    (DST 전환 중 예외, jfs의 설명 참조)
  • 나이브 날짜 시간 (UTC) → POSIX (s) :
    calendar.timegm(dt.utctimetuple())
  • 인식 날짜 시간 → POSIX (s) :
    calendar.timegm(dt.utctimetuple())
  • POSIX → struct_time (UTC, s ) :
    time.gmtime(t)
    (jfs의 주석 참조)
  • 나이브 날짜 시간 (로컬) → struct_time (UTC, s ) :
    stz.localize(dt, is_dst=None).utctimetuple()
    (DST 전환 중 예외, jfs의 설명 참조)
  • 나이브 날짜 시간 (UTC) → struct_time (UTC, s ) :
    dt.utctimetuple()
  • 인식 날짜 시간 → struct_time (UTC, s ) :
    dt.utctimetuple()
  • POSIX → Naïve 날짜 시간 (현지) :
    datetime.fromtimestamp(t, None)
    (특정 조건에서 실패 할 수 있습니다 . 아래 jfs의 주석 참조)
  • struct_time (UTC) → Naive 날짜 시간 (local, s ) :
    datetime.datetime(struct_time[:6], tzinfo=UTC).astimezone(tz).replace(tzinfo=None)
    (윤초를 나타낼 수 없음, jfs의 설명 참조)
  • 나이브 날짜 시간 (UTC) → 나이브 날짜 시간 (현지) :
    dt.replace(tzinfo=UTC).astimezone(tz).replace(tzinfo=None)
  • 날짜 시간 인식 → 나이브 날짜 시간 (현지) :
    dt.astimezone(tz).replace(tzinfo=None)
  • POSIX → 나이브 날짜 시간 (UTC) :
    datetime.utcfromtimestamp(t)
  • struct_time (UTC) → 나이브 날짜 시간 (UTC, s ) :
    datetime.datetime(*struct_time[:6])
    (윤초를 나타낼 수 없음, jfs의 설명 참조)
  • 나이브 날짜 시간 (로컬) → 나이브 날짜 시간 (UTC) :
    stz.localize(dt, is_dst=None).astimezone(UTC).replace(tzinfo=None)
    (DST 전환 중 예외, jfs의 설명 참조)
  • 날짜 시간 인식 → 나이브 날짜 시간 (UTC) :
    dt.astimezone(UTC).replace(tzinfo=None)
  • POSIX → 인식 날짜 시간 :
    datetime.fromtimestamp(t, tz)
    (pytz가 아닌 시간대의 경우 실패 할 수 있음)
  • struct_time (UTC) → Aware datetime (s) :
    datetime.datetime(struct_time[:6], tzinfo=UTC).astimezone(tz)
    (윤초를 나타낼 수 없음, jfs의 주석 참조)
  • 나이브 날짜 시간 (로컬) → 인식 날짜 시간 :
    stz.localize(dt, is_dst=None)
    (DST 전환 중 예외, jfs의 설명 참조)
  • 나이브 날짜 시간 (UTC) → 인식 날짜 시간 :
    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')

(코드는이 답변에서 UTC 날짜 시간 문자열을 로컬 날짜 시간 으로 변환 하기 위해 파생되었습니다 )


답변

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'