将日期字符串(来自 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')
您可以使用 dateutil
的 parser 来解析字符串,自动推断格式:
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 当地时间,这正是我要找的。
非常感谢所有花时间回答的人。
我想将来自 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')
您可以使用 dateutil
的 parser 来解析字符串,自动推断格式:
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 当地时间,这正是我要找的。
非常感谢所有花时间回答的人。