Ответ 1
from datetime import datetime, timedelta
datetime.utcnow() + timedelta(minutes=5)
У меня есть объект datetime python, который я хотел бы преобразовать в UTC. Я планирую вывести его в формате RFC 2822, чтобы разместить HTTP-заголовок, но я не уверен, что это важно для этого вопроса. Я нашел некоторую информацию на этом сайте о преобразовании объектов времени, и это выглядит проще, но на этот раз я действительно хочу использовать объекты datetime, потому что я использую timedeltas для их настройки:
Я пробовал что-то вроде этого:
from datetime import datetime, timedelta
now = datetime.now()
fiveMinutesLater = datetime.now() + timedelta(minutes=5)
fiveMinutesLaterUtc = ???
Ничто во времени или модуле datetime не похоже на то, что это мне поможет. Похоже, я могу это сделать, передав объект datetime через 3 или 4 функции, но мне интересно, есть ли более простой способ.
Я бы предпочел не использовать сторонние модули, но я могу, если это единственный разумный выбор.
from datetime import datetime, timedelta
datetime.utcnow() + timedelta(minutes=5)
Сначала вам нужно убедиться, что datetime является объектом, зависящим от часового пояса, установив его член tzinfo
:
http://docs.python.org/library/datetime.html#datetime.tzinfo
Затем вы можете использовать функцию .astimezone()
для ее преобразования:
http://docs.python.org/library/datetime.html#datetime.datetime.astimezone
Для тех, кто оказался здесь, ищет способ конвертировать объект datetime в UTC секунд с эпохи UNIX:
import time
import datetime
t = datetime.datetime.now()
utc_seconds = time.mktime(t.timetuple())
Вы можете использовать метод 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 меньше одного дня. Если вы хотите что-то, что работает с каким-либо значением timedelta, вы можете использовать timedelta.total_seconds()
(для Python 2.7 и более поздних) или с помощью 86400*timedelta.days + timedelta.seconds
. Я на самом деле не пробовал это, поэтому я не уверен на 100%, если он будет работать.
Для преобразования в UTC из строки даты:
from time import mktime
from datetime import datetime
mktime(datetime.utctimetuple(datetime.strptime("20110830_1117","%Y%m%d_%H%M")))
решение с фантастическим Delorean lib:
>>> import datetime
>>> import delorean
>>> dt = datetime.datetime.now()
>>> dl = delorean.Delorean(dt, timezone='US/Pacific')
>>> dl.shift('UTC')
Delorean(datetime=2015-03-27 03:12:42.674591+00:00, timezone=UTC)
>>> dl.shift('UTC').datetime
datetime.datetime(2015, 3, 27, 3, 12, 42, 674591, tzinfo=<UTC>)
>>> dl.shift('EST').datetime
datetime.datetime(2015, 3, 26, 22, 12, 42, 674591, tzinfo=<StaticTzInfo 'EST'>)
позволяет легко сменять дату и время между различными часовыми поясами
Здесь находится решение stdlib (без сторонних модулей), которое работает как на Python 2, так и на 3.
Чтобы получить текущее время UTC в формате RFC 2822:
>>> from email.utils import formatdate
>>> formatdate(usegmt=True)
'Fri, 27 Mar 2015 08:29:20 GMT'
Чтобы получить время UTC через 5 минут в будущем:
#!/usr/bin/env python
import time
from email.utils import formatdate
print(formatdate(time.time() + 300, usegmt=True)) # 5 minutes into the future
# -> Fri, 27 Mar 2015 08:34:20 GMT