2015-12-22 42 views
0

如何修改下面的代碼來處理時區,請注意沒有小數。轉換Iso8601與非十進制UTC區域防範

2015-12-22T11:57:11-08:00,-8:00正在造成我的問題,是否劃時代考慮時區?

timegm(datetime.strptime(datestring, "%Y-%m-%dT%H:%M:%S.%f").timetuple()) 
+0

@Padraic坎寧安不作爲複製的部分「正常'的時間字符串丟失 –

+0

缺少什麼? –

回答

0

這裏有幾個問題。

  1. 如果您的時間不包含微秒塊,則此日期字符串將不會與您提供的格式字符串一起使用。只需嘗試一下,不要使用-08:00位。這意味着你或者需要假設你所有的時間都沒有這個塊,或者你需要考慮兩種可能性。
  2. strptime做了一個處理ISO8601偏移的可怕工作。如果您查看格式指南,您會發現可以使用%z作爲+/- HHMM,但ISO8601時區(以我的經驗)幾乎總是以+/- HH:MM格式顯示。即使如此,%z在格式字符串中也有一種被稱爲壞指令的惡習。

要回答你的問題,是的,時區很重要。 UNIX時代自1970-01-01T00:00:00 + 00:00起秒。更重要的是,即使您在解析字符串時正確指定了對象的tzinfotimetuple也不會考慮到tzinfo。你需要使用utctimetuple

所以現在你只需要正確解析日期時間。有跡象表明,不使用外部庫解決方案,但我發現解析ISO8601日期字符串的最簡單的方法是通過PIP利用現有蟒蛇-dateutil包:

>>> import calendar 
>>> from dateutil import parser 
>>> datestring = '2015-12-22T11:57:11-08:00' 
>>> tz_aware_datetime = parser.parse(datestring) 
>>> tz_aware_datetime 
datetime.datetime(2015, 12, 22, 11, 57, 11, tzinfo=tzoffset(None, -28800)) 
>>> calendar.timegm(tz_aware_datetime.utctimetuple()) 
1450814231