У меня есть объект даты и времени Python, который я хотел бы преобразовать в UTC. Я планирую произвести его в формате RFC 2822, чтобы вставить HTTP-заголовок, но я не уверен, имеет ли это значение для этого вопроса. Я нашел некоторую информацию об этом сайте о преобразовании объектов времени, и это выглядит более простым тот путь, но на этот раз я действительно хочу использовать объекты даты и времени, потому что я использую timedeltas для корректировки их:
Я попробовал что-то вроде этого:
from datetime import datetime, timedelta
now = datetime.now()
fiveMinutesLater = datetime.now() + timedelta(minutes=5)
fiveMinutesLaterUtc = ???
Ничто во время или модуль даты и времени не похоже, он помог бы мне. Кажется, что я могу делать это путем передачи объекта даты и времени через 3 или 4 функции, но я задаюсь вопросом, существует ли более простой путь.
Я предпочел бы не использовать сторонние модули, но я могу, если это - единственный разумный выбор.
Сначала вам нужно чтобы убедиться, что datetime учитывает часовой пояс, установив его член tzinfo
:
http://docs.python.org/library/datetime.html#datetime.tzinfo
Вы можете затем используйте функцию .astimezone ()
, чтобы преобразовать его:
http://docs.python.org/library/datetime.html#datetime.datetime.astimezone
Вы можете использовать метод formatdate в модуле email.Utils, как показано ниже
>>> from email.Utils import formatdate
>>> print formatdate()
Sun, 25 Jul 2010 04:02:52 -0000
Это дата и время в формате RFC 2822. По умолчанию он возвращает время в формате UTC, но если вам нужно местное время, вы можете вызвать formatdate (localtime = True).
Для получения дополнительной информации проверьте http://docs.python.org/library/email.mime.html#module-email.util
Я нашел способ взять текущее время, добавить к нему объект timedelta, преобразовать результат в UTC и вывести его в RFC 2822:
time.strftime("%a, %d-%b-%Y %H:%M:%S GMT",
time.gmtime(time.time() + datetime.timedelta(minutes=5).seconds))
Это не совсем отвечает на мой вопрос, но я помещаю это здесь, потому что это может помочь кому-то еще в моей ситуации.
EDIT: Я хотел бы добавить, что этот трюк работает, только если временная дельта меньше одного дня. Если вам нужно что-то, что работает с любым значением временной дельты, вы можете использовать timedelta.total_seconds()
(для Python 2.7 и выше) или 86400*timedelta.days + timedelta.seconds
. На самом деле я еще не пробовал, поэтому не уверен на 100%, будет ли это работать.