Python 夏令时
我怎么检查是否正在实施夏令时呢?
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)生效,或者之前是否生效过。