2012-07-30 146 views
5

我必须用代表iso8601时间戳的字符串处理python。python:如何处理时间戳(ISO8601)

我的时间戳字符串,因此在下面的表格:

timestamp = "2011-08-18T10:29:47+03:00" 

目前我使用它们转换在python:

timestamp = timestamp[:-6] 
timestamp = datetime.datetime.strptime(timestamp, "%Y-%m-%dT%H:%M:%S") 

但这种方式我失去了所有关于时间的信息区。 我在这里看到很多例子就这么大约时间戳和蟒,遗憾的是没有人维护时区为好,或者只是使用回收的时间段延时:

delay = timestamp[-6:] 

我也曾尝试:

timestamp = "2011-08-18T10:29:47+03:00" 
timestamp = datetime.datetime.strptime(timestamp, "%Y-%m-%dT%H:%M:%S%z") 

但它返回

ValueError: 'z' is a bad directive in format '%Y-%m-%dT%H:%M:%S%z' 

您能否给一些见解?

+0

您可能的意思[互联网日期/时间格式描述在rfc 3339(iso 8601的档案)](http://tools.ietf.org/html/rfc3339#section-5.6) – jfs 2014-08-20 09:28:47

+0

相关:[ISO to datetime对象:'z'是一个不好的指令](http://stackoverflow.com/q/20194496/4279) – jfs 2015-01-08 07:20:15

回答

2

python iso8601模块内建有可以处理时区信息妙parse_date方法:

>>> import iso8601 
>>> iso8601.parse_date("2007-01-25T12:00:00Z") 
datetime.datetime(2007, 1, 25, 12, 0, tzinfo=<iso8601.iso8601.Utc ...>) 

>>> iso8601.parse_date("2011-08-18T10:29:47+03:00") 
datetime.datetime(2011, 8, 18, 10, 29, 47, tzinfo=<FixedOffset '+03:00'>) 

如果你想把它转换成另一个时区,使用astimezone(tz)方法

如果您需要获取UTC日期时间,则可以使用utctimetuple()方法。

+0

很酷。你能告诉我如何将结果转换为UTC + 0吗? – user601836 2012-07-30 13:37:26

+1

@ user601836:我用2种解决方案更新了我的答案,以便将获得的日期转换为 – 2012-07-30 13:48:23

+0

我不建议使用该库。最后一次更新是2007年,它不接受所有有效的格式。 – tback 2012-12-18 16:29:21

1

您需要添加一个提供时区支持的外部模块; pytz module为您提供了必要的时区数据库。

你要么需要手工解析时区构建pytz时区,或使用包像zc.iso8601iso8601做解析为您提供:

from zc.iso8601.parse import datetimetz 
datetimetz(timestamp)