我有一個由RFC 2822指定格式的日期 - 比如Fri, 15 May 2009 17:58:28 +0000
,作爲一個字符串。是否有一種快速和/或標準的方式將它作爲Python 2.5中的datetime
對象?我試圖產生一個strptime格式的字符串,但+0000時區說明符混淆瞭解析器。如何將RFC 2822日期/時間解析爲Python日期時間?
回答
問題是parsedate會忽略偏移量。
而是執行此操作:
from email.utils import parsedate_tz
print parsedate_tz('Fri, 15 May 2009 17:58:28 +0700')
email.util中有一個解析函數。 它解析所有有效的RFC 2822日期和一些特殊情況。
from email.utils import parsedate
print parsedate('Fri, 15 May 2009 17:58:28 +0000')
我想闡述一下以前的答案。 email.utils.parsedate
和email.utils.parsedate_tz
都返回元組,因爲OP需要datetime.datetime
對象,我添加這些例子的完整性:
from email.utils import parsedate
from datetime import datetime
import time
t = parsedate('Sun, 14 Jul 2013 20:14:30 -0000')
d1 = datetime.fromtimestamp(time.mktime(t))
或者:
d2 = datetime.datetime(*t[:6])
注意d1
和d2
都是天真datetime對象,沒有存儲時區信息。如果您需要了解日期時間對象,請檢查tzinfo
datetime()
arg。
另外,您可以使用dateutil模塊
它看起來像Python 3.3前進在email.utils的新方法parsedate_to_datetime
這需要中間步驟的護理:
email.utils。 parsedate_to_datetime(日期)
format_datetime的倒數()。執行與parsedate()相同的功能,但在 成功返回日期時間。如果輸入日期的時區爲-0000, ,則日期時間將是天真的日期時間,並且如果日期符合 與RFC的關係,則它將表示UTC的時間,但不指示 消息的實際源時區日期來自。如果 輸入日期有任何其他有效的時區偏移量,日期時間將是 一個知道的日期時間與相應的時區tzinfo。
版本3.3中的新功能。
http://python.readthedocs.org/en/latest/library/email.util.html#email.utils.parsedate_to_datetime
email.utils.parsedate_tz(date)
是使用功能。以下是一些變化。
電子郵件日期/時間字符串(RFC 5322,RFC 2822,RFC 1123)爲Unix時間戳浮法秒:
import email.utils
import calendar
def email_time_to_timestamp(s):
tt = email.utils.parsedate_tz(s)
if tt is None: return None
return calendar.timegm(tt) - tt[9]
import time
print(time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime(email_time_to_timestamp("Wed, 04 Jan 2017 09:55:45 -0800"))))
# 2017-01-04T17:55:45Z
確保您不使用mktime
(它解釋time_struct在您的計算機的本地時間,不是UTC);改爲使用timegm
或mktime_tz
(但要注意下一段中的mktime_tz
)。
如果你確信你有Python版本2.7.4,3.2.4,3.3或更高版本,那麼你可以使用email.utils.mktime_tz(tt)
而不是calendar.timegm(tt) - tt[9]
。在此之前,mktime_tz
在本地時區的秋季夏令時轉換(bug 14653)期間調用時會給出錯誤的時間。
感謝@ j-f-sebastian爲caveats about mktime and mktime_tz。
電子郵件日期/時間字符串(RFC 5322,RFC 2822,RFC 1123)到「知道」 datetime
有關python 3.3:
關於Python 3.3以上,使用email.utils.parsedate_to_datetime
,其與原始區域返回意識到datetime
偏移:
import email.utils
email.utils.parsedate_to_datetime(s)
print(email.utils.parsedate_to_datetime("Wed, 04 Jan 2017 09:55:45 -0800").isoformat())
# 2017-01-04T09:55:45-08:00
警告:如果時間落在閏秒上,這將拋出ValueError
例如email.utils.parsedate_to_datetime("Sat, 31 Dec 2016 15:59:60 -0800")
。
電子郵件日期/時間字符串(RFC 5322,RFC 2822,RFC 1123),以「知道」 datetime
在UTC區:
這只是轉換成時間戳,然後以UTC datetime
:
import email.utils
import calendar
import datetime
def email_time_to_utc_datetime(s):
tt = email.utils.parsedate_tz(s)
if tt is None: return None
timestamp = calendar.timegm(tt) - tt[9]
return datetime.datetime.utcfromtimestamp(timestamp)
print(email_time_to_utc_datetime("Wed, 04 Jan 2017 09:55:45 -0800").isoformat())
# 2017-01-04T17:55:45
電子郵件日期/時間字符串(RFC 5322,RFC 2822,RFC 1123)到python「知道」datetime
與原始偏移量:
之前到Python 3.2,Python中沒有附帶tzinfo實現,所以這裏使用dateutil.tz.tzoffset
(pip install dateutil
)的例子:
import email.utils
import datetime
import dateutil.tz
def email_time_to_datetime(s):
tt = email.utils.parsedate_tz(s)
if tt is None: return None
tz = dateutil.tz.tzoffset("UTC%+02d%02d"%(tt[9]//60//60, tt[9]//60%60), tt[9])
return datetime.datetime(*tt[:5]+(min(tt[5], 59),), tzinfo=tz)
print(email_time_to_datetime("Wed, 04 Jan 2017 09:55:45 -0800").isoformat())
# 2017-01-04T09:55:45-08:00
如果您正在使用python 3.2,你可以使用內置的tzinfo
實施datetime.timezone
:tz = datetime.timezone(datetime.timedelta(seconds=tt[9]))
,而不是第三方dateutil.tz.tzoffset
。
再次感謝@ j-f-sebastian for note on clamping the leap second。
- 1. 將Python日期時間轉換爲rfc 2822
- 2. 解析JAVA中的RFC 2822日期
- 3. 將MySQL日期時間轉換爲RFC 2822使用PHP日期()函數
- 4. 日期時間Python解析
- 5. 如何將RFC 2822格式化日期轉換爲EST日期
- 6. MYSQL日期範圍RFC 2822
- 7. 當前日期/時間到RFC 2822日期函數與VB /經典ASP
- 8. 解析日期時間到JAVA日期
- 9. 解析日期時間
- 10. 解析日期時間從美國時區到日期時間。
- 11. 解析SMS日期/時間
- 12. 解析日期和時間
- 13. C++日期時間解析
- 14. 解析日期時間
- 15. 解析日期和時間
- 16. 解析日期時間
- 17. 解析Python的日期時間
- 18. 解析器日期時間
- 19. 解析日期時間HHMMSS
- 20. Python將秒轉換爲日期時間日期和時間
- 21. Python:將MySQL日期時間轉換爲日期時間格式
- 22. 解析時間,日期/時間或日期
- 23. 解析C#日期時間到javascript日期時間
- 24. 解析ISO日期時間在Python
- 25. 如何將IronPython日期時間轉換爲.NET日期時間?
- 26. 如何將UTC日期/時間轉換爲EST日期/時間
- 27. Python ISO 8601日期時間解析
- 28. 如何使用pa ++解析日期時間並將其轉換爲RFC 3339?
- 29. 1小時關閉時轉換RFC 2822日期爲datetime
- 30. 如何用日期時間解析時區到日期時間參數
+1我不知道這個功能,真的很整齊。 – 2009-05-19 21:14:48