Python实现万年历
项目概述
本程序使用Python实现了万年历功能,能够显示指定年份和月份的日历,并同时显示对应的农历日期。
功能描述
- 阳历到农历转换
- 日期计算
- 日历输出
代码逻辑说明
1. 农历转换
import lunardate
# 农历月份和日期的中文表示
month_names = {1: '正月', 2: '二月', ...}
day_names = {1: '初一', 2: '初二', ...}
def get_lunar_str(solar_date):
# 将阳历日期转换为农历日期字符串
pass
2. 日期计算
# 计算当月首尾日期
first_date = datetime.date(year, month, 1)
last_date = datetime.date(year, month, 28)
# 计算第一天星期和当月天数
start_weekday = first_day.weekday()
total_days = (last_date - first_date).days + 1
3. 日历输出
# 生成日期矩阵
calendar_days = [''] * 42
lunar_days = [''] * 42
# 打印日历标题和星期
print(" 周一 周二 周三 周四 周五 周六 周日")
# 打印日期和农历
for week_idx in range(6):
# 打印阳历和农历行
pass
使用说明
- 修改main函数中的year和month变量
- 运行程序即可查看指定月份的日历
依赖库
- datetime
- lunardate
所有代码
import datetime
import lunardate
# 农历月份和日期的中文表示(原有字典不变)
month_names = {1: '正月', 2: '二月', 3: '三月', 4: '四月', 5: '五月', 6: '六月',
7: '七月', 8: '八月', 9: '九月', 10: '十月', 11: '冬月', 12: '腊月'}
day_names = {1: '初一', 2: '初二', 3: '初三', 4: '初四', 5: '初五',
6: '初六', 7: '初七', 8: '初八', 9: '初九', 10: '初十',
11: '十一', 12: '十二', 13: '十三', 14: '十四', 15: '十五',
16: '十六', 17: '十七', 18: '十八', 19: '十九', 20: '二十',
21: '廿一', 22: '廿二', 23: '廿三', 24: '廿四', 25: '廿五',
26: '廿六', 27: '廿七', 28: '廿八', 29: '廿九', 30: '三十'}
def get_lunar_str(solar_date):
"""获取农历日期字符串(原有逻辑不变)"""
try:
lunar = lunardate.LunarDate.fromSolarDate(solar_date.year, solar_date.month, solar_date.day)
month_str = f"闰{month_names[lunar.month]}" if lunar.is_leap_month else month_names[lunar.month]
return f"{month_str}{day_names[lunar.day]}" if lunar.day == 1 else day_names.get(lunar.day, "")
except Exception:
return ""
def main():
# 输入年份和月份(输入验证逻辑不变)
year = 2023
month = 10
# 计算当月首尾日期(原有逻辑不变)
first_date = datetime.date(year, month, 1)
last_date = datetime.date(year, month, 28)
while True:
try:
last_date = last_date.replace(day=last_date.day+1)
except:
last_date = last_date.replace(day=last_date.day-1)
break
# 计算第一天星期和当月天数(关键修改点)
first_day = datetime.date(year, month, 1)
start_weekday = first_day.weekday() # 周一=0,周日=6(原+1逻辑已移除)
total_days = (last_date - first_date).days + 1
# 生成日期矩阵(调整为周一到周日顺序)
calendar_days = [''] * 42
lunar_days = [''] * 42
current_day = 1
for i in range(start_weekday, start_weekday + total_days):
current_date = datetime.date(year, month, current_day)
calendar_days[i] = current_day
lunar_days[i] = get_lunar_str(current_date)
current_day += 1
# 打印日历标题(修改为周一到周日)
title = f"{month}月 {year}(农历{month_names[lunardate.LunarDate.fromSolarDate(year, month, 1).month]}月)"
print("\n" + title.center(40))
# 修改星期标题为中文全称
print(" 周一 周二 周三 周四 周五 周六 周日")
# 打印日期和农历(调整对齐方式)
for week_idx in range(6):
week = calendar_days[week_idx*7 : (week_idx+1)*7]
lunar_week = lunar_days[week_idx*7 : (week_idx+1)*7]
# 阳历行使用右对齐
solar_line = "".join([f"{str(day):>4}" if day != "" else " " for day in week])
print(solar_line)
# 农历行使用左对齐
lunar_line = "".join([f"{lunar:<4}" if lunar != "" else " " for lunar in lunar_week])
print(lunar_line)
if __name__ == "__main__":
main()