如何在Python中从日期时间字符串获取时区?

6

我有一个日期字符串,看起来像这样:Tue Jul 19 2016 14:00:00 GMT-0700 (PDT)。是否有一个库或函数可以做到这一点?

print get_tz('Tue Jul 19 2016 14:00:00 GMT-0700 (PDT)')
'US/Pacific'

可能是 https://dev59.com/c3A75IYBdhLWcg3wFEsI 的重复问题。 - John Gordon
@JohnGordon:不同之处在于你的问题涉及系统时区,而这个则是从一个字符串中获取时区。 - zondo
你可以尝试使用正则表达式搜索单词"GMT",也许可以吗? - ChaoticTwist
2个回答

3

我同意@MattJohnson的观点,当解析短时区名称为tzinfo对象时,您需要非常小心。但是,如果您有一个特定的上下文环境,只有一个读法有意义(例如,您正在解析在美国生成的时间戳),则可以使用python-dateutilparse函数的tzinfos参数。

这是一个示例,说明如何使用它:

from dateutil import tz
from dateutil.parser import parse

ET = tz.gettz('US/Eastern')
CT = tz.gettz('US/Central')
MT = tz.gettz('US/Mountain')
PT = tz.gettz('US/Pacific')

us_tzinfos = {'CST': CT, 'CDT': CT,
              'EST': ET, 'EDT': ET,
              'MST': MT, 'MDT': MT,
              'PST': PT, 'PDT': PT}

dt_est = parse('2014-01-02 04:00:00 EST', tzinfos=us_tzinfos)
# >>> dt_est.tzinfo
# tzfile('/usr/share/zoneinfo/US/Eastern')

dt_pst = parse('2016-03-11 16:00:00 PST', tzinfos=us_tzinfos)
# >>> dt_pst.tzinfo
# tzfile('/usr/share/zoneinfo/US/Pacific')

2
一般而言,在将时区缩写映射到时区标识符时需要小心,缩写和标识符之间不是一对一的映射关系。例如,CST 可以是中部标准时间、中国标准时间或古巴标准时间。 由于您同时具有偏移量和缩写,您可能能够进一步细化它,但您仍然会存在歧义。例如,如果字符串包含 GMT+02:00 (EET),那么它可以是此处列出的任何位置,其中一些地方全年使用 EET,其他地方冬季使用 EET,夏季使用EEST。在使用 EEST 的地方中,不是所有地方都在同一时间开始和结束。 每个不同的变化都会创建一个不同的时区标识符。例如,Europe/Bucharest、Europe/Istanbul、Europe/Chisinau 和 Asia/Amman,都使用 EET 和 EEST,但所有这些地区的过渡日期或时间略有不同。 即使当前的过渡相同,历史上也可能不同。例如,Europe/Athens 和 Europe/Helsinki 乍一看似乎相同,但考虑到赫尔辛基在1980年没有遵守 EEST 后,它们就不同了。 这些问题将影响任何试图将时区缩写和/或偏移量解析为特定时区的库或函数,不论编程语言如何

因此,尽管时区缩写仍然存在歧义,但我认为它们更像是“好用”的东西,而不是依赖于正确时间的东西。您认为通过使用时区偏移量每次都能获得正确的时间,并且最后只是使用缩写作为漂亮格式的一部分,这种做法是否可行? - Alex Cory
你能确定的是,时间戳中显示的时区偏移和缩写在特定时间生效。除非你通过其他渠道知道了具体的时区,否则不能说时区偏移或缩写适用于任何其他特定时间点。 - Matt Johnson-Pint
基本上,我们从客户端以这种形式 Tue Jul 19 2016 14:00:00 GMT-0700 (PDT) 发送日期。这样做可以确保每次服务器都能准确读取客户端的偏移量。因此,考虑到这一点,这种方法是否符合我的预期呢? - Alex Cory
它会给你客户端的当前偏移量,但这并不代表他们的偏移量曾经或者将来是多少。现在在太平洋时区你会得到-0700,但是在11月份夏令时结束后你就会得到-0800。 - Matt Johnson-Pint
假设您正在谈论作为客户端的Web浏览器,您可以考虑此答案中的一种方法之一来检索实际的时区标识符(例如America/Los_Angeles)。然后,您可以在Python中使用pytzdateutil - Matt Johnson-Pint

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接