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