Как преобразовать строку местного времени в UTC? - PullRequest
265 голосов
/ 17 сентября 2008

Как преобразовать строку даты и времени по местному времени в строку по времени UTC ?

Я уверен, что делал это раньше, но не могу найти его, и мы надеемся, что SO поможет мне (и другим) сделать это в будущем.

Уточнение : Например, если у меня есть 2008-09-17 14:02:00 в моем местном часовом поясе (+10), я бы хотел сгенерировать строку с эквивалентным UTC time: 2008-09-17 04:02:00.

Кроме того, из http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/, обратите внимание, что в общем случае это невозможно, так как при DST и других проблемах нет уникального преобразования из местного времени в UTC.

Ответы [ 18 ]

4 голосов
/ 21 августа 2012

Вы можете сделать это с:

>>> from time import strftime, gmtime, localtime
>>> strftime('%H:%M:%S', gmtime()) #UTC time
>>> strftime('%H:%M:%S', localtime()) # localtime
3 голосов
/ 02 мая 2018

Простой

Я сделал это так:

>>> 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
3 голосов
/ 23 сентября 2009

Как насчет -

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

если значение секунд равно None, то оно преобразует местное время в время UTC, иначе преобразованное время в UTC.

2 голосов
/ 20 февраля 2017

Использование 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') 

Эта библиотека облегчает жизнь:)

2 голосов
/ 09 ноября 2011

Для перехода на летнее время и т. Д.

Ни один из приведенных выше ответов не помог мне. Код ниже работает для 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>)
0 голосов
/ 13 декабря 2018

Я нашел лучший ответ на другой вопрос здесь . Он использует только встроенные библиотеки 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)

Я публикую здесь ответ, поскольку этот вопрос появляется в Google вместо связанного вопроса в зависимости от ключевых слов поиска.

0 голосов
/ 11 января 2018

В python3:

pip install python-dateutil

from dateutil.parser import tz

mydt.astimezone(tz.gettz('UTC')).replace(tzinfo=None) 
0 голосов
/ 06 ноября 2010

в этом случае ... pytz лучше lib

import pytz
utc = pytz.utc
yourdate = datetime.datetime.now()
yourdateutc = yourdate.astimezone(utc).replace(tzinfo=None)
...