我有一个来自Blackberry IPD备份的CSV转储文件,使用IPDDump创建。这里的日期/时间字符串如下所示(其中EST
是澳大利亚时区):
Tue Jun 22 07:46:22 EST 2010
我需要能够在Python中解析这个日期。首先,我尝试使用datettime中的strptime()
函数。
>>> datetime.datetime.strptime('Tue Jun 22 12:10:20 2010 EST', '%a %b %d %H:%M:%S %Y %Z')
但是,由于某些原因,返回的datetime
对象似乎没有任何与之关联的tzinfo
。
我确实在this page上读到过,显然datetime.strptime
会默默地丢弃tzinfo
,然而,我查看了文档,我找不到任何与此相关的文档here。
我已经能够使用第三方Python库dateutil来解析日期,但是我仍然很好奇我是如何错误地使用内置的strptime()
的?有没有办法让strptime()
很好地利用时区呢?
发布于 2020-09-21 16:04:07
由于strptime
返回一个具有tzinfo
属性的datetime对象,因此我们可以简单地将其替换为所需的时区。
>>> import datetime
>>> date_time_str = '2018-06-29 08:15:27.243860'
>>> date_time_obj = datetime.datetime.strptime(date_time_str, '%Y-%m-%d %H:%M:%S.%f').replace(tzinfo=datetime.timezone.utc)
>>> date_time_obj.tzname()
'UTC'
发布于 2015-12-04 18:27:40
您的时间字符串与rfc 2822 (date format in email, http headers)中的时间格式类似。你可以只使用stdlib来解析它:
>>> from email.utils import parsedate_tz
>>> parsedate_tz('Tue Jun 22 07:46:22 EST 2010')
(2010, 6, 22, 7, 46, 22, 0, 1, -1, -18000)
查看为各种Python版本生成支持时区的datetime对象的解决方案:parsing date with timezone from an email。
在此格式中,EST
is semantically equivalent to -0500
。不过,总的来说,a timezone abbreviation is not enough, to identify a timezone uniquely。
发布于 2019-09-05 23:44:49
遇到了这个问题。
我最终做了什么:
# starting with date string
sdt = "20190901"
std_format = '%Y%m%d'
# create naive datetime object
from datetime import datetime
dt = datetime.strptime(sdt, sdt_format)
# extract the relevant date time items
dt_formatters = ['%Y','%m','%d']
dt_vals = tuple(map(lambda formatter: int(datetime.strftime(dt,formatter)), dt_formatters))
# set timezone
import pendulum
tz = pendulum.timezone('utc')
dt_tz = datetime(*dt_vals,tzinfo=tz)
https://stackoverflow.com/questions/3305413
复制相似问题