Python time.timezone 函数
上次修改时间:2025 年 4 月 11 日
这个全面的指南探索了 Python 的 time.timezone 函数,它提供了本地时区与 UTC 的偏移量。我们将涵盖时区计算、夏令时和实际例子。
基本定义
time.timezone 变量包含本地时区(不含夏令时)与 UTC 的偏移量,单位为秒,向西为正。正值表示在 UTC 西边,负值表示在东边。
关键特性:恒定值(不会随夏令时改变),UTC 东部时区为负,与其他时间函数一起用于转换。它在首次导入 time 模块时初始化。
基本时区偏移
此示例演示如何获取基本时区偏移量并将其转换为小时,以便更好地阅读。
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(夏令时)以显示差异。
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 时间戳转换为本地时间,同时考虑时区偏移。
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)生成时区信息。
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 以本地时区显示文件修改时间。
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 存储时间戳的数据库时如何处理时区偏移量。
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,尽管它们的时间戳处理函数可能不同。
最佳实践
- UTC 存储: 始终在数据库中以 UTC 存储时间戳
- 本地显示: 仅为显示目的转换为本地时间
- DST 感知: 使用 time.localtime() 进行自动 DST 处理
- 负值: 记住负值表示 UTC 东部
- 现代替代方案: 对于复杂情况,请考虑使用带有 pytz 的 datetime
资料来源
作者
列出所有 Python 教程。