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
版权归属:
Administrator
许可协议:
本文使用《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》协议授权
评论区