当前位置: 首页 > article >正文

Python实现万年历

项目概述

本程序使用Python实现了万年历功能,能够显示指定年份和月份的日历,并同时显示对应的农历日期。

功能描述

  1. 阳历到农历转换
  2. 日期计算
  3. 日历输出

代码逻辑说明

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

使用说明

  1. 修改main函数中的year和month变量
  2. 运行程序即可查看指定月份的日历

依赖库

  1. datetime
  2. 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()


http://www.kler.cn/a/587964.html

相关文章:

  • DAY34 贪心算法Ⅲ
  • C++模版(复习)
  • C++|类和对象
  • Android 拍照开发——移动虚拟机摄像头
  • java简单基础学习
  • 关于离子滤波小记
  • 数据库管理-第302期 国产类RAC架构数据库网络连接方式(20250314)
  • RabbitMQ:业务幂等、死信交换机
  • C++基础——从C语言快速入门
  • matlab 自适应模糊PID在反应釜温度控制中的应用
  • 每日定投40刀BTC(9)20250312 - 20250315
  • Python 鼠标轨迹算法 - 防止游戏检测
  • Unity小框架之单例模式基类
  • 掌阅iReader全球首款 7 英寸 Carta 1300 墨水屏阅读器即将发布
  • Starship:快速且高度可定制的命令行框架!!
  • 线段树解析题型
  • android 新闻客户端和springboot后台开发(二)
  • linux——计算机内存详解通俗理解
  • CmBacktrace的cmb_cfg.h
  • java学习总结(五)MyBatis动态sql