使用Python确定时区当前是否为夏令时

使用Python确定时区当前是否为夏令时,python,time,timezone,dst,pytz,Python,Time,Timezone,Dst,Pytz,我们有一台在格林尼治时间运行的服务器。我需要编写一个Python脚本,确定它当前(在这一秒)是否在加利福尼亚州洛杉矶的夏令时(DST)。我如何才能做到这一点?我看了皮茨和时间,但我想不出来。我意识到我可以创建一些逻辑,比如将洛杉矶的当前时间与格林尼治标准时间进行比较,但是如果我可以使用标准库来代替的话,它会更干净 谢谢 编辑:以下是我设置时区的一些示例代码: from pytz import timezone import pytz from datetime import datetime,

我们有一台在格林尼治时间运行的服务器。我需要编写一个Python脚本,确定它当前(在这一秒)是否在加利福尼亚州洛杉矶的夏令时(DST)。我如何才能做到这一点?我看了皮茨和时间,但我想不出来。我意识到我可以创建一些逻辑,比如将洛杉矶的当前时间与格林尼治标准时间进行比较,但是如果我可以使用标准库来代替的话,它会更干净

谢谢

编辑:以下是我设置时区的一些示例代码:

from pytz import timezone
import pytz
from datetime import datetime, timedelta

tz = timezone('America/Los_Angeles')
// Instantiate a datetime object using tz? 
编辑:下面是一段可以工作的代码。它不优雅,这就是为什么我问是否有一个图书馆或什么是专为这个。可能像是一个isdst()函数

utc = timezone("UTC")
now = utc.localize(datetime.utcnow())
los_angeles_tz = timezone('America/Los_Angeles')
los_angeles_time = now.astimezone(los_angeles_tz)

delta = los_angeles_time.utcoffset()
dstDelta = timedelta(hours=-8)

is_dst = (delta == dstDelta)
用法:

>>> is_dst("America/Los_Angeles")
False

>>> is_dst("America/Sao_Paulo")
True
例如:

>>> isdst_now_in("America/Los_Angeles") # 2014-10-27 12:32:07 PDT-0700
True
>>> isdst_now_in("Australia/Melbourne") # 2014-10-28 06:32:07 AEDT+1100
True
以下是Unix上仅使用stdlib的版本,使用:

用法相同:

>>> time_isdst_now_in('Europe/London') # 2014-04-17 18:42:11 BST+0100
True

注意:
time.daylight
不被使用,因为。

@Marcin公平地说,它不是Python库中最友好的区域,无法尝试使用它来解决问题。因此,虽然从技术上讲,这并不是一个不合理的问题。@JonClements也许是这样,但如果能看到一些东西证明OP不仅仅是打开文档说“天哪,这看起来很难,也许有人能解决我的问题”。相关:@user1615497:你可以使用
datetime.now(tz)
获取
tz
时区中的当前时间,例如,@J.F.Sebastian-pytz文档明确说明需要使用
本地化
;将pytz时区传递给
datetime
的tzinfo参数是不够的。这是错误的吗?现在(tz)总体上是错误的,特别是UTC时区。now()用于调用pytz时区覆盖的tz.fromutc(),以执行正确的操作(使用_utc_transition_times获取有效的tzinfo)。此外,UTC是一种特殊情况:UTC偏移量为零,alwaysMore:
>>> isdst_now_in("America/Los_Angeles") # 2014-10-27 12:32:07 PDT-0700
True
>>> isdst_now_in("Australia/Melbourne") # 2014-10-28 06:32:07 AEDT+1100
True
import os
import time
from contextlib import contextmanager

@contextmanager
def local_timezone(zonename):
    #NOTE: it manipulates global state
    oldname = os.environ.get('TZ')
    try:
        os.environ['TZ'] = zonename
        time.tzset()
        yield
    finally:
        if oldname is None:
           del os.environ['TZ']
        else:
           os.environ['TZ'] = oldname
        time.tzset()

def time_isdst_now_in(zonename):
    with local_timezone(zonename):
         return time.localtime().tm_isdst > 0
>>> time_isdst_now_in('Europe/London') # 2014-04-17 18:42:11 BST+0100
True