使用 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 找出当前是不是处于夏令时的时区 [重复]的主要内容,如果未能解决你的问题,请参考以下文章