【问题标题】:How do I parse timestamp strings which contain BST (British Summer Time) into a timezone aware datetime timestamp? [duplicate]如何将包含 BST(英国夏令时)的时间戳字符串解析为时区感知的日期时间时间戳? [复制]
【发布时间】:2021-07-05 06:23:44
【问题描述】:

我有格式为“25-Oct-20 1:00:00 AM GMT”和“25-Oct-20 12:00:00 AM BST”的时间戳,我希望将它们解析为可识别时区的日期时间。我尝试使用 strptime 格式 "%d-%b-%y %I:%M:%S %p %Z"

但是 datetime.strptime 的 %Z 参数不能将 BST 识别为有效输入,我无法找出处理解析夏令时的“正确”方法。

【问题讨论】:

  • 您是不是班加罗尔标准时间或其他首字母缩写词的用户?这些三个字母的首字母缩写词没有标准。例如,IST 是印度、以色列和爱尔兰 S(tandard/ummer) 时间。 不要使用BST
  • 来自the datetime docs%Zstrptime() only accepts certain values for %Z: 1) any value in time.tzname for your machine’s locale 2) the hard-coded values UTC and GMT。所以BST 意味着你的机器认为它意味着什么,如果它可以处理它的话。在我的机器上time.tzname 只返回('EET', 'EEST')
  • 您好 Panagiotis,感谢您的回复。不幸的是,我别无选择,只能使用 BST,我正在从另一个使用 BST 指定夏令时(即英国夏令时)的服务中读取数据。
  • 这能回答你的问题吗? Python datetime strptime() does not match format - 如果您在这里搜索 SO,还有更多与“%Z 与时区缩写不匹配”相关的问题
  • 旁注:虽然%Z 适用于格林威治标准时间,但这是一个糟糕的选择,因为它无法解析到感知日期时间。

标签: python python-3.x datetime timezone python-datetime


【解决方案1】:

如果您查看来自 dateutil 的错误,它会显示如下内容:

UnknownTimezoneWarning: tzname BST identified but not understood.  
Pass `tzinfos` argument in order to correctly return a timezone-aware
datetime.  In a future version, this will raise an exception.

换句话说,您可以传入将时区别名(如“BST”)映射到适当时区信息的字典。可能是这样的:

>>> import dateutil.parser
>>> import dateutil.tz
>>> BST = dateutil.tz.gettz('Europe/London')
>>> dateutil.parser.parse('25-Oct-20 12:00:00 AM BST', tzinfos={'BST': BST})
datetime.datetime(2020, 10, 25, 0, 0, tzinfo=tzfile('/usr/share/zoneinfo/Europe/London'))

【讨论】:

  • @Darragh1066 那是因为真正的问题是使用了模棱两可的首字母缩写词。看白色这段代码。它使用事实上的标准 IANA 时区名称来创建新的“时区”缩写。有7 timezones with the BST acronym。您的代码仅适用于其中一个
  • @Darragh1066 真正的解决方案是从一开始就在字符串中使用 IANA 时区名称
  • @PanagiotisKanavos 有时世界似乎远非理想(真实);在这里,即使您使用从正确的 IANA 时区名称派生的时区对象创建日期时间对象,strftime %Z 也会返回 BST!好痛^^
  • @MrFuppes 这是一个strftime 错误。在电子商务网站必须处理来自世界各地的请求之前,大多数语言和标准库(我会说全部)都没有编写适当的时区支持,包括在 2 周通知后更改的 DST 规则(几年前的埃及) .
猜你喜欢
  • 2015-04-02
  • 2018-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-22
  • 2016-04-20
  • 2016-09-26
相关资源
最近更新 更多