我如何将Python的date时间对象转换为UTC?

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

我尝试了这样的事情:

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

时间或date时间模块中没有任何东西可以帮助我。 看来我可以通过将datetime对象传递给3或4个函数来实现,但是我想知道是否有更简单的方法。

我宁愿不使用第三方模块,但如果这是唯一合理的select,我可以。

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

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

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

然后你可以使用.astimezone()函数来转换它:

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

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

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

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

 >>> from email.Utils import formatdate >>> print formatdate() Sun, 25 Jul 2010 04:02:52 -0000 

以上是RFC 2822格式的date时间。 默认情况下,它会返回UTC时间,但如果您需要本地时间,则可以调用formatdate(localtime = True)。

有关更多信息,请检查http://docs.python.org/library/email.mime.html#module-email.util

我find了一种方法来取现在的时间,给它添加一个timedelta对象,将结果转换为UTC,并在RFC 2822中输出:

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

这并没有完全回答我的问题,但我把它放在这里,因为它可能会帮助别人在我的情况。

编辑:我想补充说,这个技巧只适用于如果timedeltaless于一天。 如果你想要的东西可以和任何timedelta值一起工作,你可以使用timedelta.total_seconds() (用于Python 2.7及更高版本)或者86400*timedelta.days + timedelta.seconds 。 我实际上没有尝试过,所以我不能100%确定它是否会工作。

从datestring转换为UTC:

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

解决scheme梦幻般的 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'>) 

它允许轻松地在不同时区之间切换date时间

这是一个stdlib解决scheme(没有第三方模块),可以在Python 2和Python 3上运行。

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

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

为了在未来5分钟内获得UTC时间:

 #!/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