alarm_plan_helper.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. from datetime import datetime, timedelta
  2. def get_query_time_range(param: dict, now: datetime = None):
  3. """
  4. 根据 param 的 start_time / end_time 生成查询区间,返回格式化后的字符串
  5. 规则:
  6. - 如果 start_time < end_time,则区间为 [昨天.start_time, 昨天.end_time]
  7. - 否则,区间为 [昨天.end_time, 今天.start_time]
  8. """
  9. now = now or datetime.now()
  10. # 解析时间
  11. start_time = datetime.strptime(param["start_time"], "%H:%M").time()
  12. end_time = datetime.strptime(param["end_time"], "%H:%M").time()
  13. today = now.date()
  14. yesterday = today - timedelta(days=1)
  15. if start_time < end_time:
  16. # 区间在同一天 (昨天)
  17. start_dt = datetime.combine(yesterday, start_time)
  18. end_dt = datetime.combine(yesterday, end_time)
  19. else:
  20. # 跨天
  21. start_dt = datetime.combine(yesterday, end_time)
  22. end_dt = datetime.combine(today, start_time)
  23. # 返回字符串
  24. return start_dt.strftime("%Y-%m-%d %H:%M:%S"), end_dt.strftime("%Y-%m-%d %H:%M:%S")
  25. def normalize_param_time(param: dict, now: datetime = None):
  26. """
  27. 把 param['start_time'], param['end_time'] (HH:MM) 转换成昨天的完整日期时间字符串
  28. 格式:YYYY-MM-DD HH:MM:SS
  29. """
  30. now = now or datetime.now()
  31. yesterday = (now - timedelta(days=1)).date()
  32. def to_datetime_str(hhmm: str) -> str:
  33. t = datetime.strptime(hhmm, "%H:%M").time()
  34. dt = datetime.combine(yesterday, t)
  35. return dt.strftime("%Y-%m-%d %H:%M:%S")
  36. return {
  37. "start_time": to_datetime_str(param["start_time"]),
  38. "end_time": to_datetime_str(param["end_time"]),
  39. }
  40. def is_point_in_rect(x, y, rect):
  41. """
  42. 判断点 (x, y) 是否在 rect 定义的矩形内
  43. rect 格式: [left, top, w, h]
  44. """
  45. if not rect or len(rect) != 4:
  46. return False
  47. left, top, w, h = rect
  48. right = left + w
  49. bottom = top + h
  50. return left <= x <= right and top <= y <= bottom