2012-05-08 39 views
34

我有一個日期時間字符串,我不知道如何在Python中解析它。在Python中分析時間字符串

的字符串是這樣的:

Tue May 08 15:14:45 +0800 2012 

我試圖

datetime.strptime("Tue May 08 15:14:45 +0800 2012","%a %b %d %H:%M:%S %z %Y") 

但Python會引發

'z' is a bad directive in format '%a %b %d %H:%M:%S %z %Y' 

根據Python的文檔:

%z UTC offset in the form +HHMM or -HHMM (empty string if the the object is naive).

什麼是解析這個時間字符串的正確格式?

+0

相關:Python的:解析日期與時區從一個電子郵件](http://stackoverflow.com/q/1790795/4279) – jfs

回答

55

datetime.datetime.strptime有時區解析問題。看一看在dateutil package

>>> from dateutil import parser 
>>> parser.parse("Tue May 08 15:14:45 +0800 2012") 
datetime.datetime(2012, 5, 8, 15, 14, 45, tzinfo=tzoffset(None, 28800)) 
+0

關於如何解析'02/Nov/2012:06:37:42 + 0000'的任何想法?這是nginx在日誌文件中使用的格式,'parser.parse'返回'ValueError:未知字符串格式'。 – zidarsk8

+0

@ zidarsk8:您首先需要在日期後刪除冒號:'''parser.parse(「06/Apr/2014:13:23:04」.replace(「:」,「」,1))''' ' –

+8

@ zidarsk8試試這個:'parser.parse(「02/Nov/2012:06:37:42 +0000」,fuzzy = True) - 指定模糊,解析器忽略它不理解的字符。 – drevicko

1
In [117]: datetime.datetime.strptime? 
Type:   builtin_function_or_method 
Base Class:  <type 'builtin_function_or_method'> 
String Form: <built-in method strptime of type object at 0x9a2520> 
Namespace:  Interactive 
Docstring: 
    string, format -> new datetime parsed from a string (like time.strptime()). 
+1

我試過'datetime.strptime(「星期二08年5月15日15:14:45 +0800 2012」,「%a%b% d%H:%M:%S%z%Y「)',但Python引發''z'格式爲'%a%b%d%H:%M:%S%z%Y' ' – xiaohan2012

13

最好的辦法就是看看沿着

>>> from datetime import datetime 
>>> date_str = 'Tue May 08 15:14:45 +0800 2012' 
>>> date = datetime.strptime(date_str, '%a %B %d %H:%M:%S +0800 %Y') 
>>> date 
datetime.datetime(2012, 5, 8, 15, 14, 45) 

林不知道該怎麼辦+0800時區的線strptime()

東西不幸的是,也許有人可以幫忙。

格式化字符串可以在http://docs.python.org/library/time.html#time.strftime找到,對於格式化打印字符串也是一樣的。

希望幫助

馬克

PS,你最好的賭注在一封來自PyPI安裝pytz時區。 (http://pytz.sourceforge.net/) 事實上,我認爲pytz有一個很好的日期時間解析方法,如果我沒有記錯的話。標準庫在時區功能的基礎上略顯薄弱。

+0

eumiro提到'datetime.datetime.strptime'在時區解析方面存在問題。我認爲這是事實 – xiaohan2012

3

它在SO中多次討論過。總之,「%z」不支持,因爲平臺不支持它。 我的解決方案是一個新的,只跳過時區:

datetime.datetime.strptime(re.sub(r"[+-]([0-9])+", "", "Tue May 08 15:14:45 +0800 2012"),"%a %b %d %H:%M:%S %Y") 
3

下面是支持可變UTC輸入時間字符串偏移STDLIB解決方案:

>>> from email.utils import parsedate_tz, mktime_tz 
>>> from datetime import datetime, timedelta 
>>> timestamp = mktime_tz(parsedate_tz('Tue May 08 15:14:45 +0800 2012')) 
>>> utc_time = datetime(1970, 1, 1) + timedelta(seconds=timestamp) 
>>> utc_time 
datetime.datetime(2012, 5, 8, 7, 14, 45)