ZetCode

Python time.daylight 函数

上次修改时间:2025 年 4 月 11 日

这篇全面的指南探讨了 Python 的 time.daylight 函数,它指示夏令时 (DST) 是否生效。我们将涵盖 DST 检测、时区处理和实际示例。

基本定义

如果本地时区当前正在实行夏令时 (DST),则 time.daylight 函数会返回一个非零值。它是 Python time 模块的一部分,并依赖于系统时区设置。

主要特征:如果 DST 未激活,则返回 0;如果激活,则返回非零值;并且其值取决于系统的时区配置。与 time.altzonetime.timezone 变量一起使用。

基本 DST 检测

time.daylight 最简单的用法是检查 DST 是否激活。此示例显示了基本用法和相关的时区变量。

basic_dst.py
import time

# Check if DST is active
dst_active = time.daylight
print(f"Is DST active? {'Yes' if dst_active else 'No'}")

# Show timezone information
print(f"Timezone offset (non-DST): {time.timezone / 3600} hours")
print(f"Timezone offset (DST): {time.altzone / 3600} hours")

此示例演示了检查 DST 状态和显示时区偏移量。 timezone 显示标准偏移量,而 altzone 显示 DST 偏移量。

请注意,time.daylight 仅指示是否为时区定义了 DST,不一定表示当前是否处于激活状态。

检查当前 DST 状态

要确定 DST 当前是否处于激活状态,请将 time.daylighttime.localtime 结合使用。此示例显示了正确的方法。

current_dst.py
import time

def is_dst_active():
    local_time = time.localtime()
    return local_time.tm_isdst > 0

print(f"Is DST currently active? {'Yes' if is_dst_active() else 'No'}")
print(f"time.daylight value: {time.daylight}")

localtime 中的 tm_isdst 标志比单独的 time.daylight 更可靠地表示当前状态。如果 DST 处于激活状态,则返回 1;如果未激活,则返回 0;如果未知,则返回 -1。

此方法考虑了实际的当前时间,而不仅仅是时区是否具有 DST 规则。

时区感知的时间显示

此示例显示了如何使用 time.daylight 和相关函数来显示具有正确 DST 感知的时间。

time_display.py
import time

def get_timezone_info():
    local_time = time.localtime()
    is_dst = local_time.tm_isdst > 0
    offset = - (time.altzone if is_dst else time.timezone)
    offset_hours = offset // 3600
    return f"UTC{offset_hours:+03d}:00 ({'DST' if is_dst else 'STD'})"

current_time = time.strftime("%Y-%m-%d %H:%M:%S")
timezone_info = get_timezone_info()

print(f"Current time: {current_time} {timezone_info}")
print(f"System reports DST defined: {'Yes' if time.daylight else 'No'}")

此代码显示当前时间,并带有正确的时区偏移量和 DST 指示器。它根据当前的 DST 状态计算正确的偏移量。

偏移量计算考虑了标准时间和夏令时两种情况。

DST 感知的时间转换

此示例演示了如何使用 time.daylight 和相关函数在 UTC 和本地时间之间进行转换,并进行正确的 DST 处理。

time_conversion.py
import time

def utc_to_local(utc_timestamp):
    # Convert UTC to local time with DST awareness
    return time.localtime(utc_timestamp)

def local_to_utc(year, month, day, hour, minute, second):
    # Convert local time to UTC with DST awareness
    local_tuple = (year, month, day, hour, minute, second, 0, 0, -1)
    return time.mktime(local_tuple)

# Current UTC time
utc_now = time.time()
print(f"UTC timestamp: {utc_now}")

# Convert to local time
local_time = utc_to_local(utc_now)
print(f"Local time: {time.strftime('%Y-%m-%d %H:%M:%S', local_time)}")
print(f"DST active: {'Yes' if local_time.tm_isdst > 0 else 'No'}")

# Convert local time back to UTC
new_utc = local_to_utc(*local_time[:6])
print(f"Converted back to UTC: {new_utc}")

此示例显示了 UTC 和本地时间之间正确的双向转换。 mktime 函数在转换时会自动处理 DST。

请注意在 mktime 中使用 -1,以使系统确定给定本地时间的 DST 状态。

检查 DST 转换日期

此示例演示了通过检查一年中 tm_isdst 何时变化来查找 DST 转换日期。

dst_transitions.py
import time

def find_dst_transitions(year):
    transitions = []
    last_dst = None
    
    # Check each day of the year
    for day in range(1, 366):
        timestamp = time.mktime((year, 1, day, 12, 0, 0, 0, 0, -1))
        local_time = time.localtime(timestamp)
        current_dst = local_time.tm_isdst > 0
        
        if last_dst is not None and current_dst != last_dst:
            transitions.append(time.strftime("%Y-%m-%d", local_time))
        last_dst = current_dst
    
    return transitions

year = 2025
print(f"DST transitions for {year}: {find_dst_transitions(year)}")
print(f"System DST flag: {time.daylight}")

此代码扫描一年以检测 DST 状态何时发生变化。它构建了一个 DST 开始或结束的转换日期列表。

DST 标志为 -1 的 mktime 函数允许系统确定每个日期的正确状态。

创建 DST 感知的调度程序

此示例显示了如何创建一个调度程序,该调度程序在设置重复事件时考虑 DST 更改。

dst_scheduler.py
import time

class DSTAwareScheduler:
    def __init__(self):
        self.last_dst = None
    
    def should_adjust(self):
        current_dst = time.localtime().tm_isdst > 0
        if self.last_dst is not None and current_dst != self.last_dst:
            self.last_dst = current_dst
            return True
        self.last_dst = current_dst
        return False
    
    def run_daily(self, hour, minute, callback):
        while True:
            now = time.localtime()
            if now.tm_hour == hour and now.tm_min == minute:
                callback()
                time.sleep(60)  # Prevent multiple runs in same minute
            
            if self.should_adjust():
                print("DST change detected - adjusting schedule")
            
            time.sleep(30)  # Check twice per minute

def daily_task():
    print(f"Task executed at {time.strftime('%Y-%m-%d %H:%M:%S')}")

scheduler = DSTAwareScheduler()
print(f"Initial DST status: {'Active' if time.daylight else 'Inactive'}")
scheduler.run_daily(8, 30, daily_task)  # Run daily at 8:30

调度程序监视 DST 更改,并且可以在发生转换时调整行为。它使用 time.localtime 检查当前 DST 状态。

对于需要在 DST 更改期间保持一致的本地时间调度的应用程序,此模式非常有用。

最佳实践

资料来源

作者

我叫 Jan Bodnar,我是一位充满热情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。到目前为止,我已经撰写了超过 1,400 篇文章和 8 本电子书。 我在编程教学方面拥有超过十年的经验。

列出所有 Python 教程