it-source

로컬 시간 문자열을 UTC로 변환하려면 어떻게 해야 합니까?

criticalcode 2022. 12. 29. 20:32
반응형

로컬 시간 문자열을 UTC로 변환하려면 어떻게 해야 합니까?

로컬 시각의 datetime 문자열UTC 시각의 문자열로 변환하려면 어떻게 해야 합니까?

전에도 해봤지만 찾을 수 없었고 앞으로도 SO가 도움이 될 것입니다.

설명:예를 들어, 만약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시간대 정보가 첨부되지 않았습니다.메뉴얼을 참조해 주세요.

모듈을 사용합니다.이 모듈은 시간대 + UTC의 전체 목록이 포함되어 있습니다.로컬 타임존이 무엇인지 파악하고 타임존 오브젝트를 작성한 후 조작하여 naigent datetime에 부가합니다.

「」를 사용합니다.datetime.astimezone()datetime을 UTC.합니다.

"2001-2-3 10:11:12" 문자열의 소스 코드(로컬 시간대 "America/Los_Angeles" 사용):

from datetime import datetime   
import pytz

local = pytz.timezone("America/Los_Angeles")
naive = 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")

주의 - 2020년 시점에서는 다음 웹 사이트를 사용하지 마십시오..utcnow() ★★★★★★★★★★★★★★★★★」.utcfromtimestamp(xxx)python3으로 넘어갔을 가능성이 높기 때문에 시간대 대응 datetime 객체를 사용해야 합니다.

>>> from datetime import timezone
>>> 
>>> # alternative to '.utcnow()'
>>> dt_now = datetime.datetime.now(datetime.timezone.utc)
>>>
>>> # alternative to '.utcfromtimestamp()'
>>> dt_ts = datetime.fromtimestamp(1571595618.0, tz=timezone.utc)

상세한 것에 대하여는, 다음을 참조해 주세요.

답변(2010년 이후):

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를 사용하는 지역에 있는 경우pytz존 밀리킨의 대답을 보세요.

특정 문자열에서 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 python 3.2 datetime.timezone사용할 수 있습니다.다음 명령을 사용하여 시간대 인식 datetime 개체를 생성할 수 있습니다.

import datetime

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

표준 시간대 변환을 수행할 준비가 되셨다면 다음을 참조하십시오.

https://medium.com/@eleroy/datetime-pytz-dateutil-gladelta-309bfbafb3f7과 함께 날짜 및 시간에 대해 알아야 할 10가지 사항

@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과 ) string --> tuple(tuple)

time.mktime
에폭(Epoch)

time.gmtime
epoch UTCepoch -->

그리고.

calendar.timegm
UTC 초 (UTC --> Epoch )

time.localtime
local epoch --> tuple in local timezone epoch --> "초"

다음은 일반적인 Python 시간 변환 요약입니다.

일부 메서드는 몇 초간의 분수를 드롭하고 (s)로 마크가 붙어 있습니다.다음과 같은 명시적 공식ts = (d - epoch) / unit대신 사용할 수 있습니다(감사합니다).

  • struct_time (UTC) → POSIX (s):
    calendar.timegm(struct_time)
  • Na440ve datetime(로컬): POSIX(s):
    calendar.timegm(stz.localize(dt, is_dst=None).utctimetuple())
    , 해 주세요 (DST 의 「」, jfs 의 「코멘트」를 참조해 주세요).
  • Na440ve datetime (UTC) → POSIX (s):
    calendar.timegm(dt.utctimetuple())
  • 인식 날짜/시간 → POSIX:
    calendar.timegm(dt.utctimetuple())
  • POSIX → struct_time (UTC, s):
    time.gmtime(t)
    를 참조해 주세요).
  • Na4ve datetime (로컬) → struct_time (UTC, s):
    stz.localize(dt, is_dst=None).utctimetuple()
    , 해 주세요 (DST 의 「」, jfs 의 「코멘트」를 참조해 주세요).
  • Na4ve datetime (UTC) → struct_time (UTC, s):
    dt.utctimetuple()
  • 인식 날짜/시간 → struct_time(UTC, s):
    dt.utctimetuple()
  • POSIX → Na440ve datetime (표준):
    datetime.fromtimestamp(t, None)
    할 수 해 주세요「jfs」를 참조해 주세요).
  • struct_time (UTC) → Na440ve datetime (로컬, s):
    datetime.datetime(struct_time[:6], tzinfo=UTC).astimezone(tz).replace(tzinfo=None)
    수 해 주세요
  • Na4ve datetime (UTC) → Na4ve datetime (표준):
    dt.replace(tzinfo=UTC).astimezone(tz).replace(tzinfo=None)
  • "datetime" → Na440ve datetime (datetime) :
    dt.astimezone(tz).replace(tzinfo=None)
  • POSIX → Na440ve datetime (UTC):
    datetime.utcfromtimestamp(t)
  • struct_time (UTC) → Na440ve datetime (UTC, s):
    datetime.datetime(*struct_time[:6])
    수 해 주세요
  • datetime (UTC
    stz.localize(dt, is_dst=None).astimezone(UTC).replace(tzinfo=None)
    , 해 주세요 (DST 의 「」, jfs 의 「코멘트」를 참조해 주세요).
  • datetime →UTC datetime → Na440ve datetime(UTC):
    dt.astimezone(UTC).replace(tzinfo=None)
  • POSIX → POSIX:
    datetime.fromtimestamp(t, tz)
    Pyzz 실패할 수 있음 (비 Pyzz 타임존의 경우)
  • struct_time(UTC) → 인식 날짜/시간(s):
    datetime.datetime(struct_time[:6], tzinfo=UTC).astimezone(tz)
    수 해 주세요
  • Na440ve datetime(표준) → "표준 datetime:
    stz.localize(dt, is_dst=None)
    , 해 주세요 (DST 의 「」, jfs 의 「코멘트」를 참조해 주세요).
  • Na440ve datetime(UTC) → "datetime" :
    dt.replace(tzinfo=UTC)

출처 : taaviburns.ca

저는 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 datetime 문자열을 로컬 datetime으로 변환하기 위한 이 응답에서 코드가 파생되었습니다.)

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의 사용 예: 소스가 a인 경우datetime.datetime ★★★t , , , , , 라고.

local_to_utc(t.timetuple())

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 3.6 an an an 。datetime.astimezone(tz=None)는 로컬 시간(표준)을 나타내는 인식된 datetime 객체를 취득하기 위해 사용할 수 있습니다.이 값은 UTC로 쉽게 변환할 수 있습니다.

from datetime import datetime, timezone
s = "2008-09-17 14:02:00"

# to datetime object:
dt = datetime.fromisoformat(s) # Python 3.7

# I'm on time zone Europe/Berlin; CEST/UTC+2 during summer 2008
dt = dt.astimezone()
print(dt)
# 2008-09-17 14:02:00+02:00

# ...and to UTC:
dtutc = dt.astimezone(timezone.utc)
print(dtutc)
# 2008-09-17 12:02:00+00:00

로의 정상적으로 만, UTC의 변환은 정상적으로 동작하고 있습니다..astimezone()tzinfo 오브젝트를 datetime 로부터의 "은 하지 마십시오.「DST 」입니다.

저는 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")

간단하죠.

이렇게 했어요.

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

화려한 구현

화려해지고 싶다면, 이것을 펑터로 바꿀 수 있습니다.

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

가 「초」인 경우None로컬 시간을 UTC 시간으로 변환하지 않으면 전달된 시간을 UTC로 변환합니다.

다음을 사용하여 수행할 수 있습니다.

>>> from time import strftime, gmtime, localtime
>>> strftime('%H:%M:%S', gmtime()) #UTC time
>>> strftime('%H:%M:%S', localtime()) # localtime

다음은 Python3의 네이티브 zoneinfo 모듈의 예입니다.9:

from datetime import datetime
from zoneinfo import ZoneInfo

# Get timezone we're trying to convert from
local_tz = ZoneInfo("America/New_York")
# UTC timezone
utc_tz = ZoneInfo("UTC")

dt = datetime.strptime("2021-09-20 17:20:00","%Y-%m-%d %H:%M:%S")
dt = dt.replace(tzinfo=local_tz)
dt_utc = dt.astimezone(utc_tz)

print(dt.strftime("%Y-%m-%d %H:%M:%S"))
print(dt_utc.strftime("%Y-%m-%d %H:%M:%S"))

방법은 그냥 보다 더 좋을 수 .dt.astimezone()변환하고 있는 타임존이 시스템의 로컬 타임존에 반영되지 않는 경우.외부 도서관에 의존하지 않아도 되는 것도 좋습니다.

주의: zoneinfo는 존재하지 않을 수 있는 IANA 데이터베이스에 의존하기 때문에 Windows 시스템에서는 작동하지 않을 수 있습니다.회피책으로 tzdata 패키지를 설치할 수 있습니다.퍼스트 파티 패키지이지만 표준 라이브러리에는 없습니다.

3. python 3.9.0을 한 후local_timedatetime.datetime ""를 사용합니다.local_time.astimezone(datetime.timezone.utc).

일광 절약 등을 위해.

위의 답변 중 특별히 도움이 되는 것은 없었습니다.다음 코드는 GMT에 유효합니다.

def get_utc_from_local(date_time, local_tz=None):
    assert date_time.__class__.__name__ == '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') 

이 라이브러리는 생활을 편하게 해줍니다:)

프로젝트 중 하나에 다음 코드가 있습니다.

from datetime import datetime
## datetime.timezone works in newer versions of python
try:
    from datetime import timezone
    utc_tz = timezone.utc
except:
    import pytz
    utc_tz = pytz.utc

def _to_utc_date_string(ts):
    # type (Union[date,datetime]]) -> str
    """coerce datetimes to UTC (assume localtime if nothing is given)"""
    if (isinstance(ts, datetime)):
        try:
            ## in python 3.6 and higher, ts.astimezone() will assume a
            ## naive timestamp is localtime (and so do we)
            ts = ts.astimezone(utc_tz)
        except:
            ## in python 2.7 and 3.5, ts.astimezone() will fail on
            ## naive timestamps, but we'd like to assume they are
            ## localtime
            import tzlocal
            ts = tzlocal.get_localzone().localize(ts).astimezone(utc_tz)
    return ts.strftime("%Y%m%dT%H%M%SZ")

나는 여기서 다른 질문에서 가장 좋은 답을 찾았다.Python 내장 라이브러리만 사용하고 로컬 타임존을 입력할 필요가 없습니다(내 경우 필수 사항).

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)

검색 키워드에 따라 링크된 질문이 아니라 구글에 이 질문이 뜨기 때문에 여기에 답변을 다시 올립니다.

객체의 datetime이 my_dtUTC를 사용하다

datetime.datetime.utcfromtimestamp(my_dt.timestamp())

가장 높은 투표율을 가진 답변에 혼란스러운 사람들을 위해.datetime 객체를 생성하여 datetime 문자열을 python의 uttime 시간으로 변환할 수 있습니다.그 후 astimezone(pytz.utc)을 사용하여 datetime을 uttime으로 가져올 수 있습니다.

예를 들면.

을 "datetime"으로 지정합니다.2021-09-02T19:02:00ZIso ★★★★★★★★★★★★★★★★」

이 문자열을 utc datetime으로 변환합니다.먼저 이 문자열을 사용하여 datetime 개체를 생성해야 합니다.

dt = datetime.strptime(dt,'%Y-%m-%dT%H:%M:%SZ')

객체가 되며, "python datetime", "python datetime", "python datetime", "python datetime" 을 사용할 수 있습니다.astimezone(pytz.utc) datetime datetime을

dt = datetime.strptime(dt,'%Y-%m-%dT%H:%M:%SZ') dt = dt.astimezone(pytz.utc)

utc로 이 datetime 객체를 할 수 .그 후 다음 명령을 사용하여 문자열로 변환할 수 있습니다.dt.strftime("%Y-%m-%d %H:%M:%S")

풀코드 예:

from datetime import datetime
import pytz

def converLocalToUTC(datetime, getString=True, format="%Y-%m-%d %H:%M:%S"):
    dt = datetime.strptime(dt,'%Y-%m-%dT%H:%M:%SZ')
    dt = dt.astimezone(pytz.utc)
    
    if getString:
        return dt.strftime(format)
    return dt

그럼 이렇게 불러도 되겠네

converLocalToUTC("2021-09-02T19:02:00Z")

https://stackoverflow.com/a/79877/7756843의 도움을 받았다.

간단히 말하면,datetimeUTC:

from datetime import datetime

def to_utc(date):
    return datetime(*date.utctimetuple()[:6])

이치노VIP를 .datetime★★★★★★★★★★★★★★★★★★:

>>> date = datetime.strptime("11 Feb 2011 17:33:54 -0800", "%d %b %Y %H:%M:%S %z")

다음으로 함수를 호출할 수 있습니다.

>>> to_utc(date)
datetime.datetime(2011, 2, 12, 1, 33, 54)

기능의 동작에 대해서, 스텝 바이 스텝:

>>> date.utctimetuple()
time.struct_time(tm_year=2011, tm_mon=2, tm_mday=12, tm_hour=1, tm_min=33, tm_sec=54, tm_wday=5, tm_yday=43, tm_isdst=0)
>>> date.utctimetuple()[:6]
(2011, 2, 12, 1, 33, 54)
>>> datetime(*date.utctimetuple()[:6])
datetime.datetime(2011, 2, 12, 1, 33, 54)

python3의 경우:

pip install python-dateutil

from dateutil.parser import tz

mydt.astimezone(tz.gettz('UTC')).replace(tzinfo=None) 

그럼...

time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime(seconds))

가 「초」인 경우None로컬 시간을 UTC 시간으로 변환하지 않으면 전달된 시간을 UTC로 변환합니다.

언급URL : https://stackoverflow.com/questions/79797/how-to-convert-local-time-string-to-utc

반응형