使用 Python 找出当前是不是处于夏令时的时区 [重复]

Posted

技术标签:

【中文标题】使用 Python 找出当前是不是处于夏令时的时区 [重复]【英文标题】:Use Python to find out if a timezone currently in daylight savings time [duplicate]使用 Python 找出当前是否处于夏令时的时区 [重复] 【发布时间】:2013-11-15 11:37:04 【问题描述】:

我们有一个在 GMT 时间运行的服务器。我需要编写一个 Python 脚本来确定它当前(此时此刻)是否是加利福尼亚州洛杉矶的夏令时(DST)。我怎样才能做到这一点?我看了一下 pytz 和 time ,但我无法弄清楚。我意识到我可以创建一些逻辑,例如将 LA 的当前时间与 GMT 时间进行比较,但如果我可以使用标准库代替它会更简洁。

谢谢

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

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

tz = timezone('America/Los_Angeles')
// Instantiate a datetime object using tz? 

编辑:这是一个可以工作的代码。它并不优雅,这就是为什么我要问是否有图书馆或为此而设计的东西。可能像 is_dst() 函数。

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)

【问题讨论】:

***.com/questions/7986776/… @Marcin 公平地说 - 它不是 Python 库中最友好的尝试解决方案的区域。因此,虽然从技术上讲是题外话,但这并不是一个不合理的问题。 @JonClements 也许是这样,但很高兴看到一些证明 OP 超越了打开文档并说“天哪,这看起来很难,也许 SO 上的某个人可以解决我的问题”。 相关:Python daylight savings time 【参考方案1】:
import pytz
from datetime import datetime, timedelta

def is_dst(zonename):
    tz = pytz.timezone(zonename)
    now = pytz.utc.localize(datetime.utcnow())
    return now.astimezone(tz).dst() != timedelta(0)

用法:

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

>>> is_dst("America/Sao_Paulo")
True

【讨论】:

@user1615497:您可以使用datetime.now(tz) 获取tz 时区的当前时间,例如is_dst = lambda zonename: bool(datetime.now(pytz.timezone(zonename)).dst()) @J.F.Sebastian - pytz 文档明确指出需要使用localize;将 pytz 时区传递给 datetime 的 tzinfo 参数是不够的。这是错的吗? 现在(tz)一般是错误的,尤其是 UTC 时区。 now() 被记录为调用被 pytz 时区覆盖的 tz.fromutc() 来做正确的事情(使用 _utc_transition_times 来获取有效的 tzinfo)。此外,UTC 是一种特殊情况:UTC 偏移量为零,始终 更多:when does datetime.now(pytz_timezone) fail?【参考方案2】:
from datetime import datetime
import pytz

isdst_now_in = lambda zonename: bool(datetime.now(pytz.timezone(zonename)).dst())

例子:

>>> 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 上使用 time.tzset() function 的纯 stdlib 版本:

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

注意:由于issues in some edge cases,time.daylight 未被使用。

【讨论】:

以上是关于使用 Python 找出当前是不是处于夏令时的时区 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

带有时区和夏令时的纪元的日期和时间(以秒为单位)

有没有办法找出 C# 夏令时前后的时间范围?

在用户的时区显示当前时间,不要忘记夏令时

夏令时计算

针对当前时区调整的不同夏令时的UTC日期[重复]

在使用利用夏令时的 Python 时区时,应该传递啥 tzinfo?