Python time.mktime 函数
上次修改时间:2025 年 4 月 11 日
这个全面的指南探讨了 Python 的 time.mktime 函数,它将本地时间的 time tuple 转换为自 epoch 以来的秒数。
基本定义
time.mktime 函数将表示本地时间的 struct_time 或 9 元素元组转换为自 epoch 以来的秒数。
主要特征:接受本地时间(不是 UTC),处理 DST,返回 float,并且是 time.localtime 的逆函数。 对于超出其范围的日期,它会引发 OverflowError。
基本 Time Tuple 转换
此示例显示了 time.mktime 的基本用法,用于将本地 time tuple 转换为时间戳。
import time
# Create a time tuple for 2025-04-11 14:30:00
time_tuple = (2025, 4, 11, 14, 30, 0, 0, 0, 0)
# Convert to timestamp
timestamp = time.mktime(time_tuple)
print(f"Timestamp: {timestamp}")
# Convert back to verify
local_time = time.localtime(timestamp)
print(f"Local time: {time.strftime('%Y-%m-%d %H:%M:%S', local_time)}")
这演示了将 time tuple 转换为时间戳并返回。 该元组必须有 9 个元素,最后三个是星期几、儒略日和 DST。
DST 标志 (-1, 0, 1) 会影响转换。 当设置为 -1 时,mktime 会猜测 DST 是否生效。
当前时间到时间戳
此示例演示了如何使用 time.mktime 和 time.localtime 获取当前本地时间作为时间戳。
import time
# Get current local time as struct_time
local_time = time.localtime()
# Convert to timestamp
timestamp = time.mktime(local_time)
print(f"Current timestamp: {timestamp}")
print(f"Formatted local time: {time.strftime('%c', local_time)}")
当您需要将当前时间作为时间戳,但想先处理时间组成部分时,这非常有用。 转换会保留 DST 信息。
请注意,这与直接返回 UTC 时间戳的 time.time() 不同。
使用 mktime 处理 DST
此示例演示了 time.mktime 如何处理夏令时转换。
import time
# Create time tuple for DST transition (example for US/Eastern)
# March 10, 2024 2:30 AM (non-existent during DST transition)
try:
time_tuple = (2024, 3, 10, 2, 30, 0, 0, 0, -1) # -1 = let mktime decide
timestamp = time.mktime(time_tuple)
print(f"Converted timestamp: {timestamp}")
print(f"Interpreted as: {time.strftime('%c', time.localtime(timestamp))}")
except Exception as e:
print(f"Error: {e}")
# November 3, 2024 1:30 AM (ambiguous during DST end)
time_tuple = (2024, 11, 3, 1, 30, 0, 0, 0, -1)
timestamp = time.mktime(time_tuple)
print(f"Converted timestamp: {timestamp}")
print(f"Interpreted as: {time.strftime('%c', time.localtime(timestamp))}")
time.mktime 调整 DST 转换期间的无效时间。 它可能会向前或向后移动时间以保持一致性。
time tuple 中的 DST 标志会影响如何解析不明确的时间。
创建特定日期
此示例演示了如何使用 time.mktime 创建特定日期(如生日或假期)的时间戳。
import time
def create_timestamp(year, month, day, hour=0, minute=0, second=0):
time_tuple = (year, month, day, hour, minute, second, 0, 0, -1)
return time.mktime(time_tuple)
# Create timestamps for various events
new_year = create_timestamp(2025, 1, 1)
birthday = create_timestamp(2025, 4, 11, 14, 30)
christmas = create_timestamp(2025, 12, 25)
print(f"New Year 2025: {new_year} ({time.ctime(new_year)})")
print(f"Birthday: {birthday} ({time.ctime(birthday)})")
print(f"Christmas 2025: {christmas} ({time.ctime(christmas)})")
此模式对于从已知日期创建时间戳很有用。 辅助函数简化了使用合理默认值的时间戳创建。
生成的时间戳可用于日期比较或调度。
使用 mktime 进行日期运算
此示例演示了通过使用 time.mktime 向日期添加天数来进行日期运算。
import time
def add_days(timestamp, days):
time_tuple = time.localtime(timestamp)
# Create new time tuple with adjusted day
new_tuple = (time_tuple.tm_year, time_tuple.tm_mon,
time_tuple.tm_mday + days, time_tuple.tm_hour,
time_tuple.tm_min, time_tuple.tm_sec,
time_tuple.tm_wday, time_tuple.tm_yday,
time_tuple.tm_isdst)
return time.mktime(new_tuple)
current = time.time()
one_week_later = add_days(current, 7)
print(f"Current: {time.ctime(current)}")
print(f"One week later: {time.ctime(one_week_later)}")
这展示了如何通过转换为 time tuple、修改和转换回来来执行日期数学运算。 mktime 处理月/年滚动。
对于更复杂的日期操作,请考虑使用 datetime 模块。
验证 Time Tuples
此示例演示了 time.mktime 如何通过检查无效日期来验证 time tuples。
import time
def is_valid_date(year, month, day):
try:
time_tuple = (year, month, day, 0, 0, 0, 0, 0, -1)
time.mktime(time_tuple)
return True
except (OverflowError, ValueError):
return False
# Test some dates
print(f"2025-02-29 valid? {is_valid_date(2025, 2, 29)}") # False (not leap)
print(f"2024-02-29 valid? {is_valid_date(2024, 2, 29)}") # True (leap)
print(f"2025-04-31 valid? {is_valid_date(2025, 4, 31)}") # False
print(f"2025-05-15 valid? {is_valid_date(2025, 5, 15)}") # True
time.mktime 对于无效日期引发异常,使其可用于验证。 这会检查不可能的日期,例如非闰年的 2 月 29 日。
该函数对于超出支持范围的日期返回 False(平台相关,通常为 1970-2038 年)。
最佳实践
- 时区:请记住 mktime 使用本地时间,而不是 UTC
- DST 处理:将 tm_isdst 设置为 -1,让 mktime 确定 DST
- 输入验证:在转换之前验证 time tuples
- 范围限制:请注意平台时间戳限制
- 精度:结果是浮点数,但通常是整数秒
资料来源
作者
列出所有 Python 教程。