2014-12-13 32 views
1

我正在尋找可能看起來像一個簡單的任務,但我發現它在Python 2.7中是一個可怕的噩夢。Python 2.7中的日期解析和格式化

我有一個日期字符串,如Sat, 13 Dec 2014 13:52:00 -0500Dec 13 2014, 13:52 am EST

任何想法,我怎麼能做到這一點,最好不這樣做,以多編碼和邏輯的實現,而是使用內置功能或流行的第三方的lib?

注:我的時區不是美國東部時間。

我來最接近的是:

import time 
import email.utils 

observationTime = email.utils.parsedate('Sat, 13 Dec 2014 13:52:00 -0500') 
print time.strftime('%b %d %Y %H:%M %p %Z', observationTime) 

但它產生:

Dec 13 2014 13:52 PM GMT Daylight Time 
+0

這真是兩個問題:(1)解析字符串,日期時間+時區,和(2)格式化日期時間( +時區)作爲一個字符串。 – thebjorn 2014-12-13 19:31:34

回答

2

你可以使用dateutil的日期字符串解析成一個時區感知日期時間:

import dateutil.parser as DP 
observationTime = DP.parse('Sat, 13 Dec 2014 13:52:00 -0500') 
# datetime.datetime(2014, 12, 13, 13, 52, tzinfo=tzoffset(None, -18000)) 

現在打印時區縮寫EST要求您將 時區感知日期時間到'US/Eastern'時區。這可以使用pytz完成。

由於還有其他時區,例如'America/Bogota',它們具有相同的utcoffset,所以不能自動完成 。

import pytz 
eastern = pytz.timezone('US/Eastern') 
observationTime = observationTime.astimezone(eastern) 
print(observationTime.strftime('%b %d %Y %H:%M %p %Z')) 
# Dec 13 2014 13:52 PM EST 
print(observationTime.strftime('%b %d %Y %H:%M %z')) 
# Dec 13 2014 13:52 -0500 

bogota = pytz.timezone('America/Bogota') 
observationTime = observationTime.astimezone(bogota) 
print(observationTime.strftime('%b %d %Y %H:%M %p %Z')) 
# Dec 13 2014 13:52 PM COT 
print(observationTime.strftime('%b %d %Y %H:%M %z')) 
# Dec 13 2014 13:52 -0500 

(注13:52 PM是不是上午......)

+0

嗯我不喜歡-0500不足以自動計算出時區的想法,但它是這樣的......我認爲這至少可以完成這項工作,所以我必須接受您的答案。非常感謝您花時間提供解決方案。 – Yaro 2014-12-13 20:02:48