2010-02-25 40 views
4

如何將Feb 25 2010, 16:19:20 CET形式的日期時間字符串轉換爲unix時期?解析時區縮寫爲UTC

目前我最好的辦法是使用time.strptime()是這樣的:

def to_unixepoch(s): 
    # ignore the time zone in strptime 
    a = s.split() 
    b = time.strptime(" ".join(a[:-1]) + " UTC", "%b %d %Y, %H:%M:%S %Z") 
    # this puts the time_tuple(UTC+TZ) to unixepoch(UTC+TZ+LOCALTIME) 
    c = int(time.mktime(b)) 
    # UTC+TZ 
    c -= time.timezone 
    # UTC 
    c -= {"CET": 3600, "CEST": 2 * 3600}[a[-1]] 
    return c 

我從其他的問題看,這可能是可以使用calendar.timegm(),並pytz等等來簡化這一點,但這些不處理縮短的時區。

我想要一個解決方案,需要最少的多餘的庫,我喜歡儘可能保持標準庫。

+0

是的,我結束了我自己的任意時區縮寫查找。我不認爲一般情況是可以解決的,因爲在全球範圍內有多個具有相同縮寫的時區。 – bobince 2010-02-25 16:28:46

+0

@bobince:好的,知道我不會錯過什麼。我發現這個令人敬畏的鏈接,這讓我感覺上面的方法更安全:http://www.timeanddate.com/library/abbreviations/timezones/ – 2010-02-26 01:07:21

回答

7

Python標準庫沒有真正實現時區。你應該使用python-dateutil。它爲標準的datetime模塊提供了有用的擴展,包括時區實現和解析器。

您可以將時區知識datetime對象轉換爲UTC與.astimezone(dateutil.tz.tzutc())。對於當前時間作爲可識別時區的日期時間對象,可以使用datetime.datetime.utcnow().replace(tzinfo=dateutil.tz.tzutc())

import dateutil.tz 

cet = dateutil.tz.gettz('CET') 

cesttime = datetime.datetime(2010, 4, 1, 12, 57, tzinfo=cet) 
cesttime.isoformat() 
'2010-04-01T12:57:00+02:00' 

cettime = datetime.datetime(2010, 1, 1, 12, 57, tzinfo=cet) 
cettime.isoformat() 
'2010-01-01T12:57:00+01:00' 

# does not automatically parse the time zone portion 
dateutil.parser.parse('Feb 25 2010, 16:19:20 CET')\ 
    .replace(tzinfo=dateutil.tz.gettz('CET')) 

不幸的是,在重複的夏令時期間,此技術將會出錯。

+1

等什麼?我認爲unix時代是普遍的。 0是格林尼治標準時間的午夜,而CET是凌晨1點。當地點只能在來回時間到達時才起作用_tuple – 2010-02-26 01:06:37

+0

你說得對,time.time()應該是UTC。 – joeforker 2010-02-26 03:35:10

+0

好的謝謝你的驗證,如果我錯了,它會破壞我的世界:) – 2010-02-26 13:04:54