2010-07-25 66 views
39

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

我试过这样的:

from datetime import datetime, timedelta 

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

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

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

+0

与标题相关:[如何在Python中将本地时间转换为UTC?](http://stackoverflow.com/q/79797/4279) – jfs 2015-03-27 08:40:28

+0

string:http://stackoverflow.com/questions/79797/how-do-i-convert-local-time-to-utc-in-python – 2015-12-05 18:30:24

回答

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

可以将email.Utils模块中像在RFC 2822格式如下

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

上面是日期时间使用formatdate方法。默认情况下,它会返回UTC时间,但如果您需要本地时间,则可以调用formatdate(localtime = True)。

欲了解更多信息,做检查http://docs.python.org/library/email.mime.html#module-email.util

+1

它不适用于Python 3;你可以[使用'email.utils'(小写)代替](http://stackoverflow.com/a/29296267/4279) – jfs 2015-03-27 08:42:35

9

首先,你需要确认的日期时间是通过设置它的tzinfo成员时区知晓对象:

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

然后,您可以使用.astimezone()功能将其转换:

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

+1

根据文档,我需要想出一个tzinfo类的子类来提出与一个对象,我可以传递给“现在”功能,使其知道我的服务器的时区。这似乎很复杂。有谁知道更简单的方法?如果我找到一个更简单的方法,我会在这里发布。 – 2010-07-26 00:26:24

+7

@ mikez302 - 看看pytz模块。它实际上是所有常用时区的datetime.tzinfo时区定义数据库。 – 2010-07-27 19:07:13

+0

@EliasZamaria:以'pytz' tzinfo对象的形式获取本地时区,您可以[使用'tzlocal.get_localzone()'](http://stackoverflow.com/q/13218506/4279) – jfs 2015-03-27 09:17:39

2

我找到了一种方法把当前时间,增加timedelta反对,结果转换为UTC,并把它输出在RFC 2822:

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%确定它是否可行。

+0

注意:'%b'可能与语言环境有关。 [使用email.utils.formatdate代替](http://stackoverflow.com/a/29296267/4279)。无关:如果您需要支持Python 2.6+并且不关心微秒,那么'86400 * timedelta.days + timedelta.seconds'总能正常工作。 – jfs 2015-03-27 08:51:46

6

对于那些谁在这里结束了寻找一种方式为datetime对象UTC秒转换自UNIX纪元:

import time 
import datetime 

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

这是不准确的,从mktime文档:将本地时间的时间元组转换为自Epoch以来的秒数。 – 2012-02-10 22:35:09

+1

这不是OP询问的问题的答案。 :( – sneak 2013-02-27 18:44:05

+0

注意:当地时间可能不明确(例如,在“回退”DST转换期间),并且有50%的“mktime()”可能返回错误的值,如果本地时区已经/不同的utc偏移量在过去/未来(许多时区的做法)*和* C'mktime()'不使用tz数据库(例如,在Windows上)将代表本地时间的朴素日期时间对象转换为UTC的便携式解决方案是to [使用'tzlocal.get_localzone()'获取本地时区为'pytz' tzinfo对象](http://stackoverflow.com/q/13218506/4279) – jfs 2015-03-27 08:37:19

2

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

from time import mktime 
from datetime import datetime 

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

这不会起作用--- mktime使用本地时区。看到http://stackoverflow.com/questions/2956886/python-calendar-timegm-vs-time-mktime – teu 2014-10-30 19:38:34

1

解决方案太棒了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'>) 

它允许不同的时区之间的datetime转向轻松

+1

我不会相信它太多,因为['delorean'的作者不了解'.now()'和'.now(tz)'](https://github.com/myusuf3/delorean/pull/46)。 – jfs 2015-03-27 09:10:15

0

下面是两个Python 2和3

作品要获得当前UTC时间在STDLIB溶液(无第三方模块) 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 
相关问题