2013-02-19 48 views
0

我做的Python日期comparizon:在Python比較日期 - 如何處理時區修飾

假設我有這樣一個日期:'Fri Aug 17 12:34:00 2012 +0000'

我解析它以下列方式:

dt=datetime.strptime('Fri Aug 17 12:34:00 2012 +0000', '%a %b %d %H:%M:%S %Y +0000')

我在文檔頁上找不到如何處理剩餘的+0000? 我想有一個更通用的解決方案,然後硬編碼值。

也許,這是很容易的,任何暗示?

回答

5

默認datetime模塊確實不是處理時區非常好;超出您當前的機器時區和UTC,它們基本上不受支持。

你必須使用一個外部庫爲或處理時區偏移手動。

外部庫選項:

  • 使用dateutil.parser可以處理只是你不在乎它扔任何日期或時間格式:

    from dateutil import parser 
    
    dt = parser.parse(s) 
    
  • iso8601 library只處理ISO 8601種格式,這包括相同的形式的時區偏移:

    import iso8601 
    datetimetext, tz = s.rsplit(None, 1) # only grab the timezone portion. 
    timezone = iso8601.iso8601.parse_timezone('{}:{}'.format(tz[:3], tz[3:])) 
    dt = datetime.strptime(datetimetext, '%a %b %d %H:%M:%S %Y').replace(tzinfo=timezone) 
    

示範每種方法的:

>>> import datetime 
>>> s = 'Fri Aug 17 12:34:00 2012 +0000' 
>>> import iso8601 
>>> timezone = iso8601.iso8601.parse_timezone('{}:{}'.format(tz[:3], tz[3:])) 
>>> datetime.datetime.strptime(datetimetext, '%a %b %d %H:%M:%S %Y').replace(tzinfo=timezone) 
datetime.datetime(2012, 8, 17, 12, 34, tzinfo=<FixedOffset '+00:00'>) 
>>> from dateutil import parser 
>>> parser.parse(s) 
datetime.datetime(2012, 8, 17, 12, 34, tzinfo=tzutc()) 
+0

感謝分享,這是我需要的。 – Blaise 2013-02-19 14:02:22

1

使用dateutil.parser

>>> import dateutil.parser 
>>> dateutil.parser.parse('Fri Aug 17 12:34:00 2012 +0000') 
>>> datetime.datetime(2012, 8, 17, 12, 34, tzinfo=tzutc()) 
3

你可能想也給Delorean看看。這既是pytz周圍的包裝和dateutil它提供了時區的操作以及方便的日期時間時區轉換。

這是我會怎麼解決德洛雷安你的問題。

>>> from delorean import parse 
>>> parse("2011/01/01 00:00:00 -0700") 
Delorean(datetime=2011-01-01 07:00:00+00:00, timezone=UTC) 

從那裏你可以通過簡單的返回.datetime屬性返回日期時間。如果你婉做了一段時間的變化簡單地使用德洛雷安對象,做.shift("UTC")