将日期字符串(来自 gmail)转换为时间戳 | Python

Convert date string (from gmail) to timestamp | Python

我想将来自 Gmail 帐户的电子邮件的接收日期保存到时间序列数据库中。

问题是我无法将从电子邮件中获得的字符串转换为时间戳。

我试过这个:

from datetime import datetime

date1 = 'Thu, 28 May 2020 08:15:58 -0700 (PDT)' 

date1_obj = datetime.strptime(date1, '%a, %d %b %Y %H:%M:%S %z %Z')

print(date1_obj)

但是出现这个错误:

Traceback (most recent call last):
  File "/format_date.py", line 11, in <module>
    date1_obj = datetime.strptime(date1, '%a, %d %b %Y %H:%M:%S %z %Z')
  File "/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/_strptime.py", line 577, in _strptime_datetime
    tt, fraction, gmtoff_fraction = _strptime(data_string, format)
  File "/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/_strptime.py", line 359, in _strptime
    (data_string, format))
ValueError: time data 'Thu, 28 May 2020 08:15:58 -0700 (PDT)' does not match format '%a, %d %b %Y %H:%M:%S %z %Z'

尝试使用或不使用括号括起时区。 阅读了很多,但没有关于如何处理包含“(PDT)”或任何其他时区的日期字符串的内容。获得正确的日期非常重要...如果我 运行 没有“(PDT)”的相同代码,得到的时间不正确(因为我的当地时间)。

我知道我可以使用字符串方法来操作它并转换为正确的日期时间,但我觉得这样会很灵活。

对不起我糟糕的英语。

谢谢!

关闭,您忘记在最后一个条目两边加上括号。

date1_obj = datetime.strptime(date1, '%a, %d %b %Y %H:%M:%S %z (%Z)')

如果即使将 %Z 括在方括号中它也不起作用,那么问题出在 %Z 指令中 https://docs.python.org/3/library/time.html

Support for the %Z directive is based on the values contained in tzname and whether daylight is true. Because of this, it is platform-specific except for recognizing UTC and GMT which are always known (and are considered to be non-daylight savings timezones).

在示例中,以下结果对我(在欧洲)ValueError

date1 = 'Thu, 28 May 2020 08:15:58 -0700 (PST)'
date1_obj = datetime.strptime(date1, '%a, %d %b %Y %H:%M:%S %z (%Z)')
print(date1_obj)

使用 GMT 时输出为 2020-05-28 08:15:58-07:00

date1 = 'Thu, 28 May 2020 08:15:58 -0700 (GMT)'
date1_obj = datetime.strptime(date1, '%a, %d %b %Y %H:%M:%S %z (%Z)')
print(date1_obj)

根据您在此答案下的评论,如果时区位不重要,您可以拆分字符串:

date1 = 'Thu, 28 May 2020 08:15:58 -0700 (GMT)'
date1_obj = datetime.strptime(date1.split(" (")[0], '%a, %d %b %Y %H:%M:%S %z')

您可以使用 dateutilparser 来解析字符串,自动推断格式:

import dateutil
s = 'Thu, 28 May 2020 08:15:58 -0700 (PDT)' 
dt = dateutil.parser.parse(s)
# datetime.datetime(2020, 5, 28, 8, 15, 58, tzinfo=tzoffset('PDT', -25200))
dt.utcoffset().total_seconds()
# -25200.0

请注意,虽然为时区指定了一个名称(“PDT”),但它只是一个 25200 秒的 UTC 偏移量。在许多情况下这就足够了,至少要转换为 UTC。

如果您需要特定时区(例如考虑 DST 转换等),您可以使用您提供给 dateutil.parser.parse 的映射字典作为 tzinfos:

tzmap = {'PDT': dateutil.tz.gettz('US/Pacific'),
         'PST': dateutil.tz.gettz('US/Pacific')}

dt = dateutil.parser.parse(s, tzinfos=tzmap)
# datetime.datetime(2020, 5, 28, 8, 15, 58, tzinfo=tzfile('US/Pacific'))
dt.utcoffset().total_seconds()
# -25200.0

嗯,大家的回答很有帮助,我终于解决了。

是这样的:

>>> from email.utils import parsedate_tz, mktime_tz
>>> date = 'Thu, 28 May 2020 08:15:58 -0700 (PST)'
>>> timestamp = mktime_tz(parsedate_tz(date))
>>> timestamp
1590678958
>>>

我检查了那个时间戳,并显示 12:15:58 当地时间,这正是我要找的。

非常感谢所有花时间回答的人。