ZetCode

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 转换为时间戳。

basic_mktime.py
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.mktimetime.localtime 获取当前本地时间作为时间戳。

current_time.py
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 如何处理夏令时转换。

dst_example.py
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 创建特定日期(如生日或假期)的时间戳。

specific_dates.py
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 向日期添加天数来进行日期运算。

date_arithmetic.py
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。

validation.py
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 年)。

最佳实践

资料来源

作者

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

列出所有 Python 教程