Как преобразовать строку даты и времени по местному времени в строку по времени 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/ обратите внимание, что в целом это невозможно, так как в случае летнего времени и других вопросов не существует уникального преобразования из местного времени в Время UTC
Ответы:
Сначала проанализируйте строку в наивном объекте datetime. Это пример
datetime.datetime
без прикрепленной информации о часовом поясе. См. Документацию дляdatetime.strptime
получения информации о разборе строки даты.Используйте
pytz
модуль, который поставляется с полным списком часовых поясов + UTC. Выясните, что такое местный часовой пояс, создайте из него объект часового пояса, манипулируйте им и присоединяйте его к наивному времени.Наконец, используйте
datetime.astimezone()
метод для преобразования даты и времени в UTC.Исходный код, используя местный часовой пояс "America / Los_Angeles", для строки "2001-2-3 10:11:12":
Оттуда вы можете использовать
strftime()
метод для форматирования даты и времени UTC по мере необходимости:источник
tzlocal.get_localzone()
чтобы получить местный часовой пояс какpytz
объект tzinfoФункция utcnow () модуля datetime может использоваться для получения текущего времени UTC.
Как упомянуто выше Томом: http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/ говорит:
ПРИМЕЧАНИЕ. - Если какие-либо ваши данные находятся в регионе, использующем DST, используйте
pytz
и посмотрите ответ Джона Милликина.Если вы хотите получить время UTC из заданной строки и вам посчастливилось оказаться в регионе мира, в котором либо не используется DST, либо у вас есть данные, которые только смещены относительно UTC без применения DST:
-> используя местное время в качестве основы для значения смещения:
-> Или из известного смещения, используя datetime.timedelta ():
ОБНОВИТЬ:
Начиная с Python 3.2
datetime.timezone
доступен. Вы можете создать объект datetime с учетом часового пояса с помощью команды ниже:Если вы готовы перейти на часовой пояс, прочитайте это:
https://medium.com/@eleroy/10-things-you-need-to-know-about-date-and-time-in-python-with-datetime-pytz-dateutil-timedelta-309bfbafb3f7
источник
tzinfo.utcoffset() must return a whole number of minutes
и так далее.Благодаря @rofly, полное преобразование строки в строку выглядит следующим образом:
Мое резюме функций
time
/calendar
:time.strptime
string -> tuple (часовой пояс не применяется, поэтому соответствует строке)
time.mktime
кортеж по местному времени -> секунды с начала эпохи (всегда по местному времени)
time.gmtime
секунд с начала эпохи -> кортеж в UTC
и
calendar.timegm
кортеж в UTC -> секунд с начала эпохи
time.localtime
секунд с начала эпохи -> кортеж в местном часовом поясе
источник
(always local time)
кажется неправильным: вход в mktime () - местное время, выход - секунды с момента epoch (1970-01-01 00:00:00 +0000 (UTC)
), которые не зависят от часового пояса.Вот краткое изложение общих преобразований времени Python.
Некоторые методы отбрасывают доли секунд и помечаются символом (ами) .
ts = (d - epoch) / unit
Вместо этого можно использовать явную формулу, например, (спасибо jfs).calendar.timegm(struct_time)
calendar.timegm(stz.localize(dt, is_dst=None).utctimetuple())
(исключение при переходах на летнее время, см. Комментарий от jfs)
calendar.timegm(dt.utctimetuple())
calendar.timegm(dt.utctimetuple())
time.gmtime(t)
(см. Комментарий от jfs)
stz.localize(dt, is_dst=None).utctimetuple()
(исключение при переходах на летнее время, см. Комментарий от jfs)
dt.utctimetuple()
dt.utctimetuple()
datetime.fromtimestamp(t, None)
(может не работать при определенных условиях, см. Комментарий от jfs ниже)
datetime.datetime(struct_time[:6], tzinfo=UTC).astimezone(tz).replace(tzinfo=None)
(не может представлять високосные секунды, см. комментарий от jfs)
dt.replace(tzinfo=UTC).astimezone(tz).replace(tzinfo=None)
dt.astimezone(tz).replace(tzinfo=None)
datetime.utcfromtimestamp(t)
datetime.datetime(*struct_time[:6])
(не может представлять високосные секунды, см. комментарий от jfs)
stz.localize(dt, is_dst=None).astimezone(UTC).replace(tzinfo=None)
(исключение при переходах на летнее время, см. Комментарий от jfs)
dt.astimezone(UTC).replace(tzinfo=None)
datetime.fromtimestamp(t, tz)
(может не работать для часовых поясов, отличных от pytz)
datetime.datetime(struct_time[:6], tzinfo=UTC).astimezone(tz)
(не может представлять високосные секунды, см. комментарий от jfs)
stz.localize(dt, is_dst=None)
(исключение во время перехода на летнее время, см. Комментарий от jfs)
dt.replace(tzinfo=UTC)
Источник: taaviburns.ca
источник
fromtimestamp(t, None)
может потерпеть неудачу, если локальный часовой пояс имеет различное смещение utc в,t
а библиотека C не имеет доступа к базе данных tz на данной платформе. Вы можете использоватьtzlocal.get_localzone()
для предоставления tzdata в портативном виде. (2)fromtimestamp(t, tz)
может потерпеть неудачу для часовых поясов, отличных от pytz. (3)datetime(*struct_time[:6])
вы пропали без вести*
. (4)timegm()
,utctimetuple()
,struct_time
основанные растворы падение доли секунды. Вы можете использовать явную формулу, такую как:ts = (d - epoch) / unit
вместо.stz.localize(dt, is_dst=None)
выдвигает исключение для неоднозначных или несуществующих локальных времен, например, во время переходов DST. Чтобы избежать исключения, используйте,stz.normalize(stz.localize(dt))
которые могут вернуть неточные результаты. (6) datetime () не может представлять високосную секунду. Преобразованиеstruct_time
в «секунды с эпохи» в качестве обходного пути в первую очередь. (7) вtime.gmtime(t)
отличие отcalendar.timegm()
ожидаемого ввода не-POSIX, если используется «правильный» часовой пояс. Используйте явную формулу, если вместо этогоgmtime = lambda t: datetime(1970,1,1, tzinfo=utc) + timedelta(seconds=t)
<table>
теги. Извините. Это сделано намеренно и специально. Если вам нужна быстрая и грязная« таблица », используйте<pre>
и ASCII-макет». Я не верю, что таблица ASCII была бы более читабельной, чем список выше.Источник: http://feihonghsu.blogspot.com/2008/02/converting-from-local-time-to-utc.html
Пример использования от bd808 : если ваш источник является
datetime.datetime
объектомt
, вызовите как:источник
t
, вызовите как: local_to_utc (t.timetuple ()).timetuple()
наборы вызововtm_isdst
для-1
; вероятностьmktime()
перехода 50% во время перехода на летнее времяМне повезло с dateutil (который широко рекомендуется на SO для других связанных вопросов):
(Код был получен из этого ответа для преобразования строки даты и времени UTC в локальную дату и время )
источник
dateutil
может потерпеть неудачу для прошлых дат, если местный часовой пояс имел другое смещение utc, чем (не связанное с переходами DST) в системах, где реализация не использует базу данных исторических часовых поясов (особенно Windows).pytz
+tzlocal
можно использовать вместо.Еще один пример с pytz, но включает localize (), который спас мой день.
источник
У меня был наибольший успех с python-dateutil :
источник
dateutil
может потерпеть неудачу на прошлые датыисточник
mktime(dt.timetuple())
может потерпеть неудачу во время перехода DST . ЕстьLocalTimezone
в документах (это работает для самого последнего определения часового пояса, но может потерпеть неудачу для прошлых дат (не связанных с DST))если вы предпочитаете datetime.datetime:
источник
mktime()
ожидает местное время в качестве входа.fromtimestamp()
возвращает местное время, а не utc. Если вы это исправите, то увидите, что эти дополнительные проблемы (напримерdateutil
, решение только для stdlib может дать сбой)просто
Я сделал это так:
Необычная реализация
Если вы хотите получить фантазию, вы можете превратить это в функтор:
Результат:
источник
Вы можете сделать это с:
источник
Как насчет -
если секунд,
None
то он преобразует местное время в UTC, иначе преобразует переданное время в UTC.источник
Для перехода на летнее время и т. Д.
Ни один из приведенных выше ответов не помог мне. Код ниже работает для GMT.
источник
Использование http://crsmithdev.com/arrow/
Эта библиотека облегчает жизнь :)
источник
Я нашел лучший ответ на другой вопрос здесь . Он использует только встроенные библиотеки Python и не требует ввода вашего местного часового пояса (требование в моем случае)
Я публикую здесь ответ, поскольку этот вопрос появляется в Google вместо связанного вопроса в зависимости от ключевых слов поиска.
источник
У меня есть этот код в одном из моих проектов:
источник
В python3:
pip install python-dateutil
источник
from dateutil import tz
Как насчет -
если секунд,
None
то он преобразует местное время в UTC, иначе преобразует переданное время в UTC.источник