ZetCode

Python time.daylight Function

Last modified April 11, 2025

This comprehensive guide explores Python's time.daylight function, which indicates whether daylight saving time (DST) is in effect. We'll cover DST detection, timezone handling, and practical examples.

Basic Definitions

The time.daylight function returns a non-zero value if daylight saving time (DST) is currently in effect for the local timezone. It's part of Python's time module and relies on system timezone settings.

Key characteristics: returns 0 if DST is not active, non-zero if active, and its value depends on the system's timezone configuration. Works with the time.altzone and time.timezone variables.

Basic DST Detection

The simplest use of time.daylight checks if DST is active. This example shows basic usage and related timezone variables.

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")

This example demonstrates checking DST status and displaying timezone offsets. The timezone shows standard offset, while altzone shows DST offset.

Note that time.daylight only indicates if DST is defined for the timezone, not necessarily if it's currently active.

Checking Current DST Status

To determine if DST is currently active, combine time.daylight with time.localtime. This example shows the proper method.

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}")

The tm_isdst flag in localtime is more reliable for current status than time.daylight alone. It returns 1 if DST is active, 0 if not, and -1 if unknown.

This method accounts for the actual current time, not just whether the timezone has DST rules.

Timezone-Aware Time Display

This example shows how to display time with proper DST awareness using time.daylight and related functions.

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'}")

This code displays the current time with proper timezone offset and DST indicator. It calculates the correct offset based on current DST status.

The offset calculation accounts for both standard time and daylight saving time scenarios.

DST-Aware Time Conversion

This example demonstrates converting between UTC and local time with proper DST handling using time.daylight and related functions.

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}")

This example shows proper bidirectional conversion between UTC and local time. The mktime function automatically handles DST when converting.

Note the use of -1 in mktime to let the system determine DST status for the given local time.

Checking DST Transition Dates

This example demonstrates finding DST transition dates by checking when tm_isdst changes throughout the year.

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}")

This code scans through a year to detect when DST status changes. It builds a list of transition dates where DST starts or ends.

The mktime function with -1 for DST flag lets the system determine the correct status for each date.

Creating a DST-Aware Scheduler

This example shows how to create a scheduler that accounts for DST changes when setting up recurring events.

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

The scheduler monitors DST changes and can adjust behavior when transitions occur. It uses time.localtime to check current DST status.

This pattern is useful for applications that need to maintain consistent local time scheduling across DST changes.

Best Practices

Source References

Author

My name is Jan Bodnar, and I am a passionate programmer with extensive programming experience. I have been writing programming articles since 2007. To date, I have authored over 1,400 articles and 8 e-books. I possess more than ten years of experience in teaching programming.

List all Python tutorials.