
本文介绍如何从嵌套 json 数据中安全、准确地提取「当前时间之后的最小发车时间」(即跳过已过期或即时发车项),避免返回 0 分钟,提升公交实时信息展示的实用性。
本文介绍如何从嵌套 json 数据中安全、准确地提取「当前时间之后的最小发车时间」(即跳过已过期或即时发车项),避免返回 0 分钟,提升公交实时信息展示的实用性。
在公交实时查询场景中,直接取 min(departure_time) 往往会返回即将发车(甚至已发车)的时间戳,导致计算出的 minutes = 0 或负值,对乘客缺乏参考价值。理想策略不是简单取“第二小值”,而是筛选出严格晚于当前时间(例如至少 1 分钟后)的有效发车时间,并取其中最小者——这本质上是获取「下一个真正可用的发车时刻」。
✅ 正确做法:时间过滤 + 最小值提取
核心思路是:在生成器表达式中加入时间阈值判断,而非依赖索引或排除法。例如,要求发车时间至少比当前时间晚 60 秒(即 ≥ time.time() + 60),再求最小值:
import time
# 设定最小允许发车时间(当前时间 + 60 秒,避免显示 0 分钟)
min_allowed_unix = time.time() + 60
# 筛选并获取首个未来有效发车时间
soonest_departure_unix = min(
item["departure_time"]
for item in tsl105513Route2["itineraries"][0]["schedule_items"]
if item["departure_time"] >= min_allowed_unix
)
minutes = int((soonest_departure_unix - time.time()) / 60)
⚠️ 为什么其他方法会失败?
- 索引访问错误(如 [1]):schedule_items[1] 是第二个元素,但不保证其时间最小;且若仅有一个未来班次,索引越界。
- 排除首个最小值(if item != soonest...):item 是字典,soonestDepartureTimeUnix 是整数,比较恒为 False,导致过滤失效,仍可能选到同一时间戳(若有重复)或未过滤掉已过期项。
- 未过滤历史时间:原始 min(...) 会包含所有 departure_time,包括已过期项,必然导致 minutes ≤ 0。
? 健壮性增强建议
为防止无有效未来班次时 min() 抛出 ValueError,应添加异常处理:
try:
soonest_departure_unix = min(
item["departure_time"]
for item in tsl105513Route2["itineraries"][0]["schedule_items"]
if item["departure_time"] >= time.time() + 60
)
minutes = max(1, int((soonest_departure_unix - time.time()) / 60)) # 至少显示 1 分钟
except ValueError:
minutes = -1 # 或显示 "No departures soon"
✅ 总结
获取“第二低值”是伪需求;真实业务诉求是获取下一个有效、可感知的发车时间。通过 time.time() + threshold 进行前置过滤,再求 min,逻辑清晰、健壮高效,且天然兼容重复时间戳、空列表等边界情况。此模式适用于任何基于时间排序的实时调度数据解析场景。











