You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
report_app/app/tools/eval_holiday.py

106 lines
3.6 KiB
Python

from datetime import datetime, timedelta
from lunarcalendar import Converter, Lunar # 用于农历转换
# 为完成,需求不明确
holiday_dict = {
"元旦": {
"type": "fixed",
"date": {"month": 1, "day": 1},
"duration": 1, # 假期天数
},
"春节": {
"type": "lunar",
"date": {"month": 1, "day": 1}, # 农历正月初一
"duration": 7,
},
"清明节": {"type": "fixed", "date": {"month": 4, "day": 4}, "duration": 3},
"劳动节": {"type": "fixed", "date": {"month": 5, "day": 1}, "duration": 5},
"端午节": {
"type": "lunar",
"date": {"month": 5, "day": 5}, # 农历五月初五
"duration": 3,
},
"中秋节": {
"type": "lunar",
"date": {"month": 8, "day": 15}, # 农历八月十五
"duration": 1,
},
"国庆节": {"type": "fixed", "date": {"month": 10, "day": 1}, "duration": 7},
}
def is_holiday(year, month, day):
current_date = datetime(year, month, day)
# 检查是否是固定节假日
for holiday, info in holiday_dict.items():
if info["type"] == "fixed":
holiday_date = datetime(year, info["date"]["month"], info["date"]["day"])
if (current_date - holiday_date).days >= 0 and (
current_date - holiday_date
).days < info["duration"]:
print(f"今天是:{holiday}")
return True, holiday
# 检查是否是农历节假日
for holiday, info in holiday_dict.items():
if info["type"] == "lunar":
lunar_month = info["date"]["month"]
lunar_day = info["date"]["day"]
# 将农历转换为公历
lunar = Lunar(year, lunar_month, lunar_day)
solar_date = Converter.Lunar2Solar(lunar)
# 判断当前日期是否在农历节假日范围内
delta = (
current_date
- datetime(solar_date.year, solar_date.month, solar_date.day)
).days
if delta >= 0 and delta < info["duration"]:
print(f"今天是:{holiday}")
return True, holiday
return False, None
def get_last_year_holiday_data(year, month, day, holiday_name):
last_year = year - 1
if holiday_dict[holiday_name]["type"] == "fixed":
# 获取去年节假日的开始日期和结束日期
start_date = datetime(
last_year,
holiday_dict[holiday_name]["date"]["month"],
holiday_dict[holiday_name]["date"]["day"],
)
end_date = start_date + timedelta(
days=holiday_dict[holiday_name]["duration"] - 1
)
else:
lunar_month = holiday_dict[holiday_name]["date"]["month"]
lunar_day = holiday_dict[holiday_name]["date"]["day"]
# 将去年的农历转换为公历
lunar = Lunar(last_year, lunar_month, lunar_day)
solar_date = Converter.Lunar2Solar(lunar)
start_date = datetime(solar_date.year, solar_date.month, solar_date.day)
end_date = start_date + timedelta(
days=holiday_dict[holiday_name]["duration"] - 1
)
print(f"去年节假日数据时间段: {start_date}{end_date}")
# 在这里调用数据库查询或其他方法获取去年的数据
# last_year_data = query_data_from_db(start_date, end_date)
return start_date, end_date
year = 2024
month = 9
day = 17
is_holiday_flag, holiday_name = is_holiday(year, month, day)
if is_holiday_flag:
start_date, end_date = get_last_year_holiday_data(year, month, day, holiday_name)
print(f"去年{holiday_name}的日期范围:{start_date} - {end_date}")