Using dateutil.parser
您可以直接正确解析您的日期。
注意CST
是一个不明确的时区,因此您需要指定您所指的时区。您可以直接在tzinfos
的参数parse()
调用或者您可以定义一个具有时区映射的字典并传递它。在此字典中,您可以指定偏移量,例如
timezone_info = {
"CDT": -5 * 3600,
"CEST": 2 * 3600,
"CST": 8 * 3600
}
parser.parse(r, tzinfos=timezone_info)
或(使用gettz
) 直接指定时区:
timezone_info = {
"CDT": gettz("America/Chicago"),
"CEST": gettz("Europe/Berlin"),
"CST": gettz("Asia/Shanghai")
}
parser.parse(r, tzinfos=timezone_info)
另请参阅dateutil.parser 文档 https://dateutil.readthedocs.io/en/stable/parser.html以及答案这个问题 https://stackoverflow.com/q/51206500/14015737.
请注意,如果您所在的位置实行夏令时,则后一种方法会很棘手!根据您申请的日期,gettz("America/Chicago")
结果将是 UTC-5 或 UTC-6(因为芝加哥在中部标准时间和中部夏令时间之间切换)。因此,根据您的输入数据,第二个示例实际上可能并不正确并产生错误的结果!目前,中国全年遵守中国标准时间 (CST),因此对于您的用例而言,这没有什么区别(但可能取决于您的日期范围)。
Overall:
from dateutil import parser
from dateutil.tz import gettz
timezone_info = {"CST": gettz("Asia/Shanghai")}
r = 'Thu Dec 17 08:56:41 CST 2020'
d = parser.parse(r, tzinfos=timezone_info)
print(d)
print(d.strftime('%Y-%m-%d %H:%M:%S %Z%z'))
gets you
2020-12-17 08:56:41+08:00
2020-12-17 08:56:41 CST+0800
EDIT:使用这种方法打印人类可读的时区名称而不是缩写的名称只是稍微复杂一点,因为dateutil.tz.gettz()
给你一个tzfile
没有属性,只有名称。但是,您可以通过受保护的方式获取它_filename
using split()
:
print(d.strftime('%Y-%m-%d %H:%M:%S') + " in " + "/".join(d.tzinfo._filename.split('/')[-2:]))
yields
2020-12-17 08:56:41+08:00 in Asia/Shanghai
这当然只有在你使用过的情况下才有效gettz()
首先设置时区。
EDIT 2: 如果你know不管怎样,你所有的日期都是 CST,你也可以在解析时忽略时区。这会让你得到天真的(或无意识的)日期时间,然后你可以在其中添加人类可读的时区。您可以使用以下方法执行此操作replace()
并指定时区,如上所示使用gettz()
或使用timezone(()
来自pytz
module:
from dateutil import parser
from dateutil.tz import gettz
import pytz
r = 'Thu Dec 17 08:56:41 CST 2020'
d = parser.parse(r, ignoretz=True)
d_dateutil = d.replace(tzinfo=gettz('Asia/Shanghai'))
d_pytz = d.replace(tzinfo=pytz.timezone('Asia/Shanghai'))
请注意,根据您使用哪个模块添加时区信息,tzinfo
不同。为了pytz
对象,有一种更直接的方法以人类可读的形式访问时区:
print(type(d_dateutil.tzinfo))
print("/".join(d_dateutil.tzinfo._filename.split('/')[-2:]))
print(type(d_pytz.tzinfo))
print(d_pytz.tzinfo.zone)
produces
<class 'dateutil.tz.tz.tzfile'>
Asia/Shanghai
<class 'pytz.tzfile.Asia/Shanghai'>
Asia/Shanghai