2012-07-30 170 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)