from datetime import datetime, timedelta def get_query_time_range(param: dict, now: datetime = None): """ 根据 param 的 start_time / end_time 生成查询区间,返回格式化后的字符串 规则: - 如果 start_time < end_time,则区间为 [昨天.start_time, 昨天.end_time] - 否则,区间为 [昨天.end_time, 今天.start_time] """ now = now or datetime.now() # 解析时间 start_time = datetime.strptime(param["start_time"], "%H:%M").time() end_time = datetime.strptime(param["end_time"], "%H:%M").time() today = now.date() yesterday = today - timedelta(days=1) if start_time < end_time: # 区间在同一天 (昨天) start_dt = datetime.combine(yesterday, start_time) end_dt = datetime.combine(yesterday, end_time) else: # 跨天 start_dt = datetime.combine(yesterday, end_time) end_dt = datetime.combine(today, start_time) # 返回字符串 return start_dt.strftime("%Y-%m-%d %H:%M:%S"), end_dt.strftime("%Y-%m-%d %H:%M:%S") def normalize_param_time(param: dict, now: datetime = None): """ 把 param['start_time'], param['end_time'] (HH:MM) 转换成昨天的完整日期时间字符串 格式:YYYY-MM-DD HH:MM:SS """ now = now or datetime.now() yesterday = (now - timedelta(days=1)).date() def to_datetime_str(hhmm: str) -> str: t = datetime.strptime(hhmm, "%H:%M").time() dt = datetime.combine(yesterday, t) return dt.strftime("%Y-%m-%d %H:%M:%S") return { "start_time": to_datetime_str(param["start_time"]), "end_time": to_datetime_str(param["end_time"]), } def is_point_in_rect(x, y, rect): """ 判断点 (x, y) 是否在 rect 定义的矩形内 rect 格式: [left, top, w, h] """ if not rect or len(rect) != 4: return False left, top, w, h = rect right = left + w bottom = top + h return left <= x <= right and top <= y <= bottom