Complete guide to Python's time.daylight function covering daylight saving time detection, timezone handling, and practical examples.
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.
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.
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
dst_active = time.daylight print(f"Is DST active? {‘Yes’ if dst_active else ‘No’}")
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.
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.
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.
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)
utc_now = time.time() print(f"UTC timestamp: {utc_now}")
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’}")
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.
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.
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.
Current status: Use tm_isdst for current DST status, not just time.daylight
Time conversions: Always use -1 for tm_isdst in mktime when possible
System reliance: Remember DST rules come from system timezone data
Edge cases: Handle ambiguous times during DST transitions
Alternatives: Consider datetime with pytz for more robust timezone handling
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.