2010-07-20 33 views
7

我想將字符串時間戳轉換成適當的日期時間對象。我遇到的問題是存在時區偏移,我所做的一切似乎都不起作用。將字符串時間戳(帶時區偏移量)轉換爲本地時間。 。 ? python

最終我想將字符串時間戳轉換爲我的計算機時區中的日期時間對象。

# string timestamp  
date = u"Fri, 16 Jul 2010 07:08:23 -0700" 
+1

你可以發佈你到目前爲止的代碼嗎? – bstpierre 2010-07-20 03:38:20

回答

8

dateutil包是非常方便的解析日期/時間:

In [10]: date = u"Fri, 16 Jul 2010 07:08:23 -0700" 

In [11]: from dateutil.parser import parse 

In [12]: parse(date) 
Out[12]: datetime.datetime(2010, 7, 16, 7, 8, 23, tzinfo=tzoffset(None, -25200)) 

最後,轉換到本地時區,

In [13]: parse(date).astimezone(YOUR_LOCAL_TIMEZONE) 
+0

我該如何把它變成符合我當前時區的時間表示? 並感謝那btw :) – alfredo 2010-07-20 03:57:44

+0

很高興提供幫助。您可以使用parse返回的datetime對象的'astimezone'方法。看到這個問題的細節:http://stackoverflow.com/questions/79797/how-do-i-convert-local-time-to-utc-in-python – ars 2010-07-20 04:13:14

+0

Dateutil岩石!解析我的字符串(「2013-10-22T21:56:00.000-03:00」),而不必提供格式字符串。 – fccoelho 2013-10-23 11:29:35

4

看起來datetime.datetime.strptime(d, '%a, %d %b %Y %H:%M:%S %z')應該工作,但根據到this bug report處理有%z問題。所以,你可能要處理你自己的時區:

import datetime 

d = u"Fri, 16 Jul 2010 07:08:23 -0700" 

d, tz_info = d[:-5], d[-5:] 
neg, hours, minutes = tz_info[0], int(tz_info[1:3]), int(tz_info[3:]) 
if neg == '-': 
    hours, minutes = hours * -1, minutes * -1 

d = datetime.datetime.strptime(d, '%a, %d %b %Y %H:%M:%S ') 
print d 
print d + datetime.timedelta(hours = hours, minutes = minutes) 
0

這裏有一個STDLIB解決方案:

>>> from datetime import datetime 
>>> from email.utils import mktime_tz, parsedate_tz 
>>> datetime.fromtimestamp(mktime_tz(parsedate_tz(u"Fri, 16 Jul 2010 07:08:23 -0700"))) 
datetime.datetime(2010, 7, 16, 16, 8, 23) # your local time may be different 

又見,Python: parsing date with timezone from an email

注意:如果本地時區在過去(2010年)如果不在給定平臺上使用歷史時區數據庫,則本地時區具有不同的UTC偏移。要解決此問題,您可以使用tzlocal.get_localzone()獲取代表您本地時區的pytz tzinfo對象。 pytz以便攜方式提供對tz數據庫的訪問:

>>> timestamp = mktime_tz(parsedate_tz(u"Fri, 16 Jul 2010 07:08:23 -0700")) 
>>> import tzlocal # $ pip install tzlocal 
>>> str(datetime.fromtimestamp(timestamp, tzlocal.get_localzone())) 
'2010-07-16 16:08:23+02:00' 
相關問題