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 教程。