Python夏令时

Paw*_*iak 40 python time dst

如何检查夏令时是否有效?

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是否(或曾经)对您当前的时区有效.

  • @brian buck:虽然不一样.对于给定的时区,`time.daylight`是常量,因为日光区域存在或不存在.另一方面,`tm_isdst`标志反映给定时间是否在*DST开始和结束日期之内. (9认同)
  • 唉唉!我讨厌这些排序为Python问题的答案,因为它是不亮(我)如何把这个变成一个功能的命令行示例.(我天真的努力,试图time.localtime().tm_isdst的不工作).所以我将进一步下探,并增强了答案. (9认同)
  • 它应该是`_.tm_isdst > 0`(`-1` 值是可能的)。 (2认同)

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)


meh*_*guh 9

如果您在笔记本电脑上运行代码,则可接受的答案很好,但是大多数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这些时间。