Python 夏令时

79 投票
8 回答
92471 浏览
提问于 2025-04-15 22:58

我怎么检查是否正在实施夏令时呢?

8 个回答

12

假设你想在一个 datetime 对象上进行这个操作。

你可以使用 pytz 这个库来让它知道时区,然后检查它的 dst 属性:

import datetime
import pytz

def is_dst(dt,timeZone):
   aware_dt = timeZone.localize(dt)
   return aware_dt.dst() != datetime.timedelta(0,0)

timeZone = pytz.timezone("Europe/London")

dt = datetime.datetime(2019,8,2)
is_dst(dt,timeZone)
True

dt = datetime.datetime(2019,2,2)
is_dst(dt,timeZone)
False
62

接受的答案在你在笔记本电脑上运行代码时是可以的,但大多数Python应用程序是在服务器上运行的,服务器使用协调世界时(UTC)作为本地时间,所以根据接受的答案,它们永远不会处于夏令时。

第二个问题是,不同地区实施夏令时的日期和时间各不相同。所以即使你有一个明确的时间,比如datetime.utcnow(),在一个时区可能是夏令时,而在另一个时区却不是。

因此,我们能做的就是判断某个特定时区的时间是否在夏令时期间,而我找到的最佳方法是使用pytz库中的localize函数,这样我们就能得到一个在笔记本电脑和服务器上都能很好工作的答案。

import pytz

from datetime import datetime

def is_dst(dt=None, timezone="UTC"):
    if dt is None:
        dt = datetime.utcnow()
    timezone = pytz.timezone(timezone)
    timezone_aware_date = timezone.localize(dt, is_dst=None)
    return timezone_aware_date.tzinfo._dst.seconds != 0

一些示例

>>> is_dst() # it is never DST in UTC
False
>>> is_dst(datetime(2019, 1, 1), timezone="US/Pacific")
False
>>> is_dst(datetime(2019, 4, 1), timezone="US/Pacific")
True
>>> is_dst(datetime(2019, 3, 10, 2), timezone="US/Pacific")
NonExistentTimeError
>>> is_dst(datetime(2019, 11, 3, 1), timezone="US/Pacific")
AmbiguousTimeError

在我们的is_dst函数中,我们将is_dst=None作为参数传递给timezone.localize,这样会导致一些无效的时间抛出错误。你也可以使用is_dst=False来忽略这些错误,并对这些时间返回False

87

你可以使用 time.localtime 这个功能,并查看返回结果中的 tm_isdst 标志。

>>> import time
>>> time.localtime()
(2010, 5, 21, 21, 48, 51, 4, 141, 0)
>>> _.tm_isdst
0

通过使用 time.localtime(),你可以对任何特定的时间进行同样的询问,以查看在你所在的时区是否会有夏令时(DST)生效,或者之前是否生效过。

撰写回答