ZetCode

Python time.timezone 函数

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

这个全面的指南探索了 Python 的 time.timezone 函数,它提供了本地时区与 UTC 的偏移量。我们将涵盖时区计算、夏令时和实际例子。

基本定义

time.timezone 变量包含本地时区(不含夏令时)与 UTC 的偏移量,单位为秒,向西为正。正值表示在 UTC 西边,负值表示在东边。

关键特性:恒定值(不会随夏令时改变),UTC 东部时区为负,与其他时间函数一起用于转换。它在首次导入 time 模块时初始化。

基本时区偏移

此示例演示如何获取基本时区偏移量并将其转换为小时,以便更好地阅读。

basic_timezone.py
import time

# Get timezone offset in seconds
offset_seconds = time.timezone
print(f"Timezone offset in seconds: {offset_seconds}")

# Convert to hours
offset_hours = offset_seconds / 3600
print(f"Timezone offset in hours: {offset_hours:.1f}")

# Determine direction
direction = "west" if offset_seconds > 0 else "east"
print(f"Timezone is {abs(offset_hours):.1f} hours {direction} of UTC")

此示例显示原始偏移值并将其转换为小时。方向根据偏移量的符号计算。

请注意,这不考虑夏令时。对于支持夏令时的计算,请使用 time.altzone 代替。

比较 Timezone 和 Altzone

此示例比较 time.timezone(标准时间)和 time.altzone(夏令时)以显示差异。

compare_zones.py
import time

print(f"Standard time offset: {time.timezone / 3600:.1f} hours")
print(f"Daylight time offset: {time.altzone / 3600:.1f} hours")

difference = (time.timezone - time.altzone) / 3600
print(f"Daylight saving difference: {difference:.1f} hours")

is_dst = time.daylight and time.localtime().tm_isdst > 0
print(f"Is daylight saving time active? {is_dst}")

该示例显示了标准时间和夏令时偏移量。它们之间的差异通常在大多数时区中为 1 小时。

time.daylight 标志指示是否为时区定义了夏令时,而 tm_isdst 显示它当前是否处于活动状态。

时区感知的时间戳转换

此示例演示如何使用 time.timezone 将 UTC 时间戳转换为本地时间,同时考虑时区偏移。

timezone_conversion.py
import time

def utc_to_local(utc_timestamp):
    # Apply timezone offset (convert seconds to hours)
    local_timestamp = utc_timestamp - time.timezone
    return time.localtime(local_timestamp)

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

# Compare with built-in localtime()
builtin_local = time.localtime(utc_now)
print(f"Built-in localtime: {time.strftime('%Y-%m-%d %H:%M:%S', builtin_local)}")

这显示了使用时区偏移手动从 UTC 转换为本地时间。结果与 Python 的内置 localtime() 匹配。

请注意,这不会自动处理夏令时。对于生产代码,请直接使用 localtime()datetime 模块。

HTTP 标头中的时区

此示例演示如何使用 time.timezone 为 HTTP 标头(如 Date)生成时区信息。

http_timezone.py
import time

def format_http_date(timestamp=None):
    if timestamp is None:
        timestamp = time.time()
    
    # Convert to GMT time struct
    gmt_time = time.gmtime(timestamp)
    
    # Format according to HTTP spec
    return time.strftime("%a, %d %b %Y %H:%M:%S GMT", gmt_time)

def get_timezone_offset():
    offset = -time.timezone  # Invert sign for HTTP convention
    hours = offset // 3600
    minutes = (offset % 3600) // 60
    return f"{hours:+03d}{minutes:02d}"

print("HTTP Date header:", format_http_date())
print("Timezone offset for headers:", get_timezone_offset())

HTTP 使用 GMT/UTC 作为日期,但有时需要时区偏移量。这显示了正确的 HTTP 日期格式和偏移量计算。

偏移量符号被反转,因为 HTTP 对 UTC 东部使用正值,与 Python 的约定相反。

时区感知的文件时间戳

此示例演示如何使用 time.timezone 以本地时区显示文件修改时间。

file_timestamps.py
import os
import time

def get_local_file_mtime(filename):
    # Get file modification time (UTC timestamp)
    mtime = os.path.getmtime(filename)
    
    # Adjust for timezone offset
    local_mtime = mtime - time.timezone
    
    # Convert to time struct
    return time.localtime(local_mtime)

filename = "example.txt"
with open(filename, "w") as f:
    f.write("Test content")

mtime = get_local_file_mtime(filename)
print(f"File modified at: {time.strftime('%Y-%m-%d %H:%M:%S', mtime)}")

# Compare with direct conversion
print(f"Built-in localtime: {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(os.path.getmtime(filename)))}")

文件时间戳通常以 UTC 存储。这显示了如何使用时区偏移量将其转换为本地时间。

结果与 Python 的内置转换匹配,证明了手动计算的正确性。

数据库操作中的时区

此示例显示了在使用以 UTC 存储时间戳的数据库时如何处理时区偏移量。

database_timezone.py
import time
import sqlite3

# Create in-memory database
conn = sqlite3.connect(":memory:")
conn.execute("CREATE TABLE events (id INTEGER PRIMARY KEY, name TEXT, created REAL)")

# Insert current UTC time
utc_now = time.time()
conn.execute("INSERT INTO events (name, created) VALUES (?, ?)", 
             ("Test Event", utc_now))
conn.commit()

# Retrieve and convert to local time
for row in conn.execute("SELECT name, created FROM events"):
    name, utc_timestamp = row
    local_time = time.localtime(utc_timestamp - time.timezone)
    print(f"Event '{name}' created at {time.strftime('%Y-%m-%d %H:%M:%S', local_time)}")

conn.close()

数据库通常以 UTC 存储时间戳。此示例演示了使用时区偏移量将其转换回本地时间以进行显示。

同样的原则适用于其他数据库,如 MySQL 或 PostgreSQL,尽管它们的时间戳处理函数可能不同。

最佳实践

资料来源

作者

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

列出所有 Python 教程