如何将Python日期时间对象转换为UTC?

How can I convert a Python datetime object to UTC?

我有一个python datetime对象,我想转换为UTC。 我计划以RFC 2822格式输出它以放入HTTP标头,但我不确定这对于这个问题是否重要。 我在这个网站上找到了一些关于转换时间对象的信息,它看起来更简单,但这次我真的想使用datetime对象,因为我使用timedeltas来调整它们:

我试过这样的事情:

1
2
3
4
5
from datetime import datetime, timedelta

now = datetime.now()
fiveMinutesLater = datetime.now() + timedelta(minutes=5)
fiveMinutesLaterUtc = ???

时间或日期时间模块中的任何内容看起来都不会对我有所帮助。 看起来我可以通过将datetime对象传递给3或4个函数来完成它,但我想知道是否有更简单的方法。

我宁愿不使用第三方模块,但我可能会认为它是唯一合理的选择。


1
2
from datetime import datetime, timedelta
datetime.utcnow() + timedelta(minutes=5)

首先,您需要通过设置其tzinfo成员来确保datetime是一个时区感知对象:

http://docs.python.org/library/datetime.html#datetime.tzinfo

然后,您可以使用.astimezone()函数进行转换:

http://docs.python.org/library/datetime.html#datetime.datetime.astimezone


对于那些最终在这里寻找将日期时间对象转换为自UNIX时代以来的UTC秒的方法的人:

1
2
3
4
5
import time
import datetime

t = datetime.datetime.now()
utc_seconds = time.mktime(t.timetuple())


这是一个适用于Python 2和3的stdlib解决方案(没有第三方模块)。

以RFC 2822格式获取当前UTC时间:

1
2
3
>>> from email.utils import formatdate
>>> formatdate(usegmt=True)
'Fri, 27 Mar 2015 08:29:20 GMT'

要在未来5分钟获得UTC时间:

1
2
3
4
5
6
#!/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

要从日期字符串转换为UTC:

1
2
3
4
from time import mktime
from datetime import datetime

mktime(datetime.utctimetuple(datetime.strptime("20110830_1117","%Y%m%d_%H%M")))


我找到了一种方法来获取当前时间,向其添加timedelta对象,将结果转换为UTC,并在RFC 2822中输出:

1
2
time.strftime("%a, %d-%b-%Y %H:%M:%S GMT",
    time.gmtime(time.time() + datetime.timedelta(minutes=5).seconds))

这并没有完全回答我的问题,但是我把它放在这里是因为它可以帮助我的情况下的其他人。

编辑:我想补充一点,这个技巧只有在timedelta不到一天的情况下才有效。如果你想要一些适用于任何timedelta值的东西,你可以使用timedelta.total_seconds()(对于Python 2.7及更高版本)或86400*timedelta.days + timedelta.seconds。我还没有尝试过,所以我不能100%确定它是否有效。


您可以在email.Utils模块中使用formatdate方法,如下所示

1
2
3
>>> 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


解决方案与梦幻般的Delorean lib:

1
2
3
4
5
6
7
8
9
10
11
12
>>> 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'>)

它允许轻松地在不同时区之间转换日期时间