You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

读取时间表文本文件,如何优雅计算课程间的空闲时长?

嘿,这个需求我之前帮人处理过类似的,核心思路其实很清晰:先把所有课程时间解析成计算机能识别的时间对象,按顺序排好,再逐个计算相邻课程的间隔。下面给你拆解成具体可落地的步骤,保证优雅又实用:

第一步:从文本中提取并解析课程时间

首先得把txt里符合Ddd hh:mm-hh:mm格式的字符串捞出来,用正则表达式是最高效的方式。然后把每个字符串拆成「星期几」「开始时间」「结束时间」,再转换成可计算的时间对象(用Python标准库datetime就足够,不用额外装包)。

举个可直接运行的Python示例:

import re
from datetime import datetime, timedelta

# 正则匹配规则:匹配3字母星期 + 开始-结束时间(兼容单/双位数小时)
time_pattern = r'(\w{3}) (\d{1,2}:\d{2})-(\d{1,2}:\d{2})'

# 读取文件并提取所有课程条目
course_list = []
with open('你的时间表文件.txt', 'r', encoding='utf-8') as f:
    for line in f:
        # 一行可能有多个课程,所以用findall
        matches = re.findall(time_pattern, line.strip())
        for match in matches:
            day_abbr, start_str, end_str = match
            # 把星期缩写转成数字(周一=0,周日=6,可根据你的习惯调整)
            day_mapping = {'Mon':0, 'Tue':1, 'Wed':2, 'Thu':3, 'Fri':4, 'Sat':5, 'Sun':6}
            day_num = day_mapping[day_abbr.capitalize()]  # 兼容大小写
            
            # 用一个虚拟基准日期,把星期和时间拼接成完整datetime对象
            base_date = datetime(2024, 1, 1)  # 随便选一个已知星期的日期,这里是周一
            # 调整到目标星期几
            target_date = base_date + timedelta(days=day_num - base_date.weekday())
            # 解析开始/结束时间,替换到目标日期上
            start_dt = datetime.strptime(start_str, '%H:%M').replace(
                year=target_date.year, month=target_date.month, day=target_date.day
            )
            end_dt = datetime.strptime(end_str, '%H:%M').replace(
                year=target_date.year, month=target_date.month, day=target_date.day
            )
            
            course_list.append({
                'day': day_abbr,
                'start': start_dt,
                'end': end_dt
            })
第二步:按时间顺序排序课程

要计算间隔,必须先把课程按「星期几+开始时间」排序,不然跨天跨星期的间隔会算错:

# 排序逻辑:先按星期几的数字,再按当天的开始时间
course_list.sort(key=lambda x: (x['start'].weekday(), x['start']))
第三步:计算相邻课程的休息时长

遍历排序后的列表,逐个计算前一节课结束到后一节课开始的时间差,还能处理跨星期的特殊情况:

for idx in range(1, len(course_list)):
    prev_course = course_list[idx-1]
    curr_course = course_list[idx]
    
    # 计算时间差
    break_delta = curr_course['start'] - prev_course['end']
    
    # 处理跨星期的情况(比如周日晚的课到周一早)
    if break_delta.total_seconds() < 0:
        break_delta += timedelta(days=7)
    
    # 转换成小时输出,也可以转成分钟
    break_hours = break_delta.total_seconds() / 3600
    print(f"👉 从{prev_course['day']} {prev_course['end'].strftime('%H:%M')}到{curr_course['day']} {curr_course['start'].strftime('%H:%M')},休息时长:{break_hours:.1f}小时")

像你举的例子:周五12:00-15:00和周五17:00-19:00,这段代码会算出刚好2小时的休息时间,完全符合预期。

第四步:生成时间表&实时空闲提醒

如果要做一个能提醒「距离下节课还有多久」的功能,只需要对比当前时间和排序后的课程:

now = datetime.now()
# 找到第一个开始时间在当前时间之后的课程
next_course = None
for course in course_list:
    if course['start'] > now:
        next_course = course
        break

if next_course:
    time_left = next_course['start'] - now
    hours_left = time_left.total_seconds() / 3600
    print(f"\n⏰ 距离下一节课({next_course['day']} {next_course['start'].strftime('%H:%M')})还有{hours_left:.1f}小时")
else:
    print("\n🎉 本周没有后续课程啦,好好休息!")
一些小优化建议
  • 如果课程是每周循环的,用python-dateutil库的rrule可以更方便地处理重复事件,不用每次都解析星期几
  • 可以把解析后的课程转成pandas DataFrame,轻松生成可视化的表格时间表
  • 正则表达式可以根据实际文本调整,比如有些文本可能用全称星期(比如Friday而不是Fri),可以把\w{3}改成\w{3,9}来兼容

内容的提问来源于stack exchange,提问作者Mark Kalydy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:33:28