문제

날짜/시간을 어떻게 변환하나요? 현지 시간의 문자열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 시간으로의 고유한 변환이 없기 때문에 불가능합니다.

도움이 되었습니까?

해결책 3

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

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

time.gmtime
에포크 이후 초 -> UTC의 튜플

그리고

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

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

다른 팁

먼저 문자열을 순진한 날짜/시간 객체로 구문 분석합니다.이는 다음의 예입니다. 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 모듈의 유트나우() 함수를 사용하여 현재 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 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 사용할 수 있습니다.아래 명령을 사용하여 시간대 인식 날짜/시간 개체를 생성할 수 있습니다.

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

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

일부 메소드는 초 단위를 삭제하고 다음과 같이 표시됩니다. (에스).다음과 같은 명시적인 공식 ts = (d - epoch) / unit 대신 사용할 수 있습니다(jfs에게 감사드립니다).

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

나는 행운을 빌어요 날짜 유틸리티 (기타 관련 질문에 대해서는 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'

나는 가장 큰 성공을 거두었습니다. 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

어때요 -

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

초라면 None 그런 다음 현지 시간을 UTC 시간으로 변환하고, 그렇지 않으면 전달된 시간을 UTC로 변환합니다.

단순한

나는 이렇게 했다:

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

일광 절약 시간제 등을 우회하는 데 사용됩니다.

위의 답변 중 특별히 도움이 된 것은 없습니다.아래 코드는 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') 

이 도서관은 삶을 쉽게 만들어줍니다 :)

python3에서:

pip install python-dateutil

from dateutil.parser import tz

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

다른 질문에서 가장 좋은 답변을 찾았습니다. 여기.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)

검색어에 따라 링크된 질문이 아닌 구글에 이 질문이 뜨기 때문에 답변을 여기에 다시 게시합니다.

이 경우에는 ...pytz가 최고의 라이브러리입니다

import pytz
utc = pytz.utc
yourdate = datetime.datetime.now()
yourdateutc = yourdate.astimezone(utc).replace(tzinfo=None)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top