Gre*_*ill 62
您可以使用time.localtime并查看tm_isdst返回值中的标志.
>>> import time
>>> time.localtime()
(2010, 5, 21, 21, 48, 51, 4, 141, 0)
>>> _.tm_isdst
0
Run Code Online (Sandbox Code Playgroud)
使用时time.localtime(),您可以在任意时间内询问相同的问题,以查看DST是否(或曾经)对您当前的时区有效.
oto*_*can 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
Run Code Online (Sandbox Code Playgroud)
如果您在笔记本电脑上运行代码,则可接受的答案很好,但是大多数python应用程序都在使用UTC作为本地时间的服务器上运行,因此根据可接受的答案,它们永远不会处于夏令时。
第二个问题是不同的地区在不同的日期和时间实现夏时制。因此,即使您有明确的时间(例如)
datetime.utcnow(),也可能是一个时区的夏令时,而不是另一个时区。
我们能做的最好的就是告诉给定时间是否在DST期间发生在特定时区,而我能找到的最好的方法已经由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
Run Code Online (Sandbox Code Playgroud)
一些例子
>>> 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
Run Code Online (Sandbox Code Playgroud)
在is_dst函数中,我们将指定is_dst=None为的参数
timezone.localize,这将导致无用的时间抛出错误。您可以is_dst=False用来忽略这些错误,然后返回False这些时间。