2009-08-19 77 views
6

假設我有一個像「2009-08-18 13:52:54-04」的時區。我可以使用像這樣的一行來解析它的大部分內容:如何在Python中使用UTC偏移量解析時區?

datetime.strptime(time_string, "%Y-%m-%d %H:%M:%S") 

但是,我無法獲得工作時區。有%Z處理文本時區(「EST」,「UTC」等),但我沒有看到任何可以解析「-04」的東西。

+0

Dupe- [如何翻譯了ISO 8601的時間字符串轉換爲Python的datetime對象?(http://stackoverflow.com/questions/969285/how-do-i-translate-a-iso-8601-datetime-string-into-a-python-datetime-object/3908349)(並且答案是'dateutil.parser。解析(日期字符串)'在兩個) – Yarin 2012-03-01 15:05:32

+0

相關:[如何在python中用-0400時區字符串解析日期?](http://stackoverflow.com/q/1101508/4279) – jfs 2014-04-17 01:36:09

回答

0

我遇到同樣的問題,最近運行和使用此代碼周圍工作:

gmt_offset_str = time_string[-3:] 
gmt_offset_seconds = int(gmt_offset_str)*60*60 
timestamp = time.strptime(time_string[:-4], '%Y-%m-%d %H:%M:%S') 
return time.localtime(time.mktime(timestamp)-gmt_offset_seconds) 

我也有興趣在一個更優雅的解決方案。

+3

其a相當天真的解決方案。它可以工作,但是在白天節約時間和不使用節能時間的情況下,你會遇到難題。它更好地使用內置對象。 – voyager 2009-08-19 20:03:53

+0

'mktime()'在這裏不正確。改用'calendar.timegm()'。來自stdlib的'email.utils.mktime_tz'在Python 2.7.4 – jfs 2015-01-13 09:40:22

0

你可以做到這一點directrly在構造函數:class datetime.datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]]),tzinfo是一個datetime.tzinfo dervided對象。

tzinfo是一個抽象基類,意味着這個類不應該直接實例化。您需要派生一個具體的子類,並且(至少)提供您使用的日期時間方法所需的標準tzinfo方法的實現。日期時間模塊不提供任何具體的tzinfo子類。

你需要覆蓋的是utcoffset(self, dt)方法。

返回UTC以UTC爲單位的本地時間偏移量。如果當地時間在UTC以西,則應該是負值。請注意,這應該是UTC的總偏移量;例如,如果tzinfo對象同時表示時區和DST調整,則utcoffset()應返回它們的總和。如果UTC偏移量未知,則返回無。否則,返回的值必須是一個timedelta對象,指定在-1439至1439(含)範圍內的整數分鐘數(1440 = 24 * 60;偏移量的大小必須小於一天)。 UTCOFFSET的大多數實現()可能會看起來像這兩個中的一個:

return CONSTANT # fixed-offset class

return CONSTANT + self.dst(dt) # daylight-aware class

如果UTCOFFSET()不返回None,DST()不應該要麼返回無。

utcoffset()的默認實現引發NotImplementedError。

22

也許你可以用dateutil.parser.parse?該方法也在wiki.python.org/WorkingWithTime上提及。

>>> from dateutil.parser import parse 
>>> parse("2009-08-18 13:52:54-04") 
datetime.datetime(2009, 8, 18, 13, 52, 54, tzinfo=tzoffset(None, -14400)) 

(是這個問題重複?)

+3

之前的dateutil中有+1。這是你的答案 – Yarin 2012-03-01 14:53:38

相關問題