侧边栏壁纸
博主头像
前端学习

行动起来,活在当下

  • 累计撰写 313 篇文章
  • 累计创建 18 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Python练习:排版查询工具

Administrator
2026-06-15 / 0 评论 / 0 点赞 / 0 阅读 / 0 字
from datetime import datetime, date, timedelta
# 上班基准日期
BASE_DATE = date(2026, 6, 12)
# 换班基准号
BASE_SWITCH_DATE = 25
# 上班基准天数
BASE_WORK_DAYS = 2
# 休息基准天数
BASE_REST_DAYS = 2
# 周期数组
BASE_CYCLE_DAYS_LIST = []

# 设置周期数组的值
def set_cycle_days_list(base_day: int, value: bool):
    for i in range(base_day):
        BASE_CYCLE_DAYS_LIST.append(value)
set_cycle_days_list(BASE_WORK_DAYS, True)
set_cycle_days_list(BASE_REST_DAYS, False)

# 周期基准天数
BASE_CYCLE_DAYS = BASE_WORK_DAYS + BASE_REST_DAYS


def main():
  choice = input("请输入日期(2026-06-12):")
  # 解析用户输入的日期字符串为 date 对象
  # strptime 传参:日期字符串,日期格式 %Y-%m-%d是指年-月-日 格式
  target_date = datetime.strptime(choice, "%Y-%m-%d").date()
  # 计算目标日期与基准日期的天数差
  delta_date = target_date - BASE_DATE
  print(delta_date.days)
  # 计算天数差值在周期中的位置
  cycle_index = delta_date.days % BASE_CYCLE_DAYS

  # 获取目标日期的工作状态
  def get_work_status():
    return "工作日" if BASE_CYCLE_DAYS_LIST[cycle_index] else "休息日"

  # 获取当前周期的所有日期(只返回日部分)
  def get_cycle_days():
    cycle_days = []
    for i in range(BASE_CYCLE_DAYS):
        # 用基准日期 + 天数偏移量得到具体日期
        cycle_date = target_date - timedelta(days=cycle_index - i)
        cycle_days.append(cycle_date.day)  # 只取日期的日部分
    return cycle_days

  # 获取白夜班
  def get_day_shift(val:bool):
    return "白班" if val else "夜班"

  if delta_date.days > 0:
    print(get_work_status())

    # 计算是否换班 小于换班基准号说明一定没换班
    if target_date.day < BASE_SWITCH_DATE:
      print(get_day_shift(target_date.month % 2 == 0))
    else:
      # 先判断改周期是否包含了换班基准号
      is_switch = BASE_SWITCH_DATE in get_cycle_days()
      # 偶数月默认白班;周期已跨过换班号(is_switch 为 False)则翻转班次
      is_even_month = target_date.month % 2 == 0
      print(get_day_shift(is_even_month if is_switch else not is_even_month))
  else:
    print("目标日期应该在基准日期之后")
  return

if __name__ == "__main__":
  while True:
    main()
    # 可选:询问是否继续
    choice = input("是否继续查询?(y/n): ")
    if choice.lower() != 'y':
        break

0

评论区