在使用利用夏令时的 Python 时区时,应该传递啥 tzinfo?

Posted

技术标签:

【中文标题】在使用利用夏令时的 Python 时区时,应该传递啥 tzinfo?【英文标题】:When working with Python time-zones that utilize daylight-savings time, what tzinfo should be passed?在使用利用夏令时的 Python 时区时,应该传递什么 tzinfo? 【发布时间】:2021-06-17 10:57:12 【问题描述】:

我正在尝试将日期字符串转换为日期时间,但找不到任何可靠的文档涉及哪些时区代码映射到哪些时区,特别是我正在处理使用夏令时的时区。

我有 4 个潜在的时区代码,我正在尝试确定要传递给 tz.gettz 的夏令时代码。

import dateutil.parser as p
import dateutil.tz as tz

tzinfos = "CST": tz.gettz("America/Chicago"),
           "CDT": tz.gettz("?"),                # HERE
           "EST": tz.gettz("America/Eastern"),
           "EDT": tz.gettz("?")                 # HERE
           

date_strings = ["Wed Mar 03 09:44:59 CST 2021",
                "Wed Mar 03 09:44:59 CDT 2021",
                "Wed Mar 03 09:44:59 EST 2021",
                "Wed Mar 03 09:44:59 EDT 2021"]

for s in date_strings:
    print(p.parse(s, tzinfos=tzinfos))

日期字符串是通过我所在州交通部提供的 API 输入的,该 API 从州高速公路内置的传感器获取数据,最终目标是将它们全部转换为 UTC 时间,但我无法知道他们的 UTC 时间应该是多少,所以我不能只猜测时区然后验证它们。

我一直在经历this wikipedia page of timezones 并且看起来好像CDTCST 相同,为tz.gettz("America/Chicago") 但我正在处理的应用程序将用于调度交通事故的第一响应者,因此时间转换至关重要正确处理。我希望找到有关应该传递给tz.gettz() 函数的文档?

【问题讨论】:

谨慎实施 IST,可以是以色列标准时间或印度标准时间。 @user3486184,不错!我查找了全球时区缩写列表,IST 也用于爱尔兰标准时间,UTC+1。还有其他重复,timeanddate.com/time/zones 【参考方案1】:

看看dateutil.tz的文档:

help(dateutil.tz)
... |以美国东部时区为例,我们可以看到一个 ``tzfile`` |提供标准夏令时偏移的时区信息: | | .. testsetup:: tzfile | |从 dateutil.tz 导入 gettz |从日期时间导入日期时间 | | .. doctest:: tzfile | | >>> NYC = gettz('America/New_York') | >>> 纽约 | tzfile('/usr/share/zoneinfo/America/New_York') | | >>> print(datetime(2016, 1, 3, tzinfo=NYC)) # EST | 2016-01-03 00:00:00-05:00 | | >>> print(datetime(2016, 7, 7, tzinfo=NYC)) # EDT | 2016-07-07 00:00:00-04:00 ...

时区会根据日期自动计算夏令时偏移量。所以你的tzinfos 应该是:

tzinfos = "CST": tz.gettz("America/Chicago"),
           "CDT": tz.gettz("America/Chicago"),                
           "EST": tz.gettz("America/Eastern"),
           "EDT": tz.gettz("America/Eastern")                 
           

真的要花时间阅读整个文档,它非常简洁。 “America/New_York”时区甚至占二战期间全年的夏令时。

【讨论】:

啊,谢谢!我在 dateutil.parser 的文档中花费了相当多的时间,但我想我没有在 dateutil.tz 的文档中花费足够的时间!欣赏它:)

以上是关于在使用利用夏令时的 Python 时区时,应该传递啥 tzinfo?的主要内容,如果未能解决你的问题,请参考以下文章

通用时区:你应该知道的数据库时区知识

使用 Python 找出当前是不是处于夏令时的时区 [重复]

Joda-Time,夏令时计算,时区独立测试

使用 pytz 时区时 Python 日期时间不包括 DST

通用时区:你应该知道的数据库时区知识

在python中将具有时区缩写的非UTC时间字符串转换为UTC时间,同时考虑夏令时