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

农历节日倒计时:基于Python的公历与农历日期转换及节日查询小程序(升级版)

农历节日倒计时:基于Python的公历与农历日期转换及节日查询小程序升级版

调整的功能

上一个小程序只是能计算当年的农历节日的间隔时间,那么这次修改一下,任意年份的农历节日都可以,并且能输出农历节日对应的阳历日期,而且可以循环输入,直到输入q退出。


1. 引言

农历是中国传统历法,许多重要的节日如春节、端午节、中秋节等都基于农历日期。然而,由于农历与公历之间的差异(尤其是闰月的存在),直接通过公历日期来计算这些节日的具体时间并不容易。为了帮助用户更方便地了解即将到来的农历节日,开发了这款基于Python的农历节日倒计时程序。

2. 功能概述

该程序的主要功能包括:

  • 农历节日查询:用户可以通过输入农历节日名称(如“春节”、“端午节”等),查询该节日对应的公历日期。
  • 倒计时计算:程序会根据当前日期,计算距离下一个该节日还有多少天。
  • 闰月处理:程序能够自动处理闰月的情况,确保计算结果的准确性。
  • 跨年处理:如果当前日期已经过了当年的节日,程序会自动计算下一年度的节日日期。
3. 技术实现
3.1 核心库:lunardate

程序依赖于lunardate库来进行公历与农历之间的日期转换。lunardate是一个轻量级的Python库,支持农历和公历之间的相互转换,并且能够正确处理闰月问题。通过该库,我们可以轻松获取任意农历日期对应的公历日期,反之亦然。

  1. 程序源码
import datetime
from lunardate import LunarDate

# 定义一些常用的农历节日及其对应的农历日期
lunar_holidays = {
    "春节": (1, 1),  # 正月初一
    "元宵节": (1, 15),  # 正月十五
    "清明节": (4, 4),  # 清明时节
    "端午节": (5, 5),  # 五月初五
    "中秋节": (8, 15),  # 八月十五
    "重阳节": (9, 9)  # 九月初九
}

def get_lunar_date(year, month, day):
    """ 获取给定公历日期对应的农历日期 """
    lunar = LunarDate.fromSolarDate(year, month, day)
    return lunar.month, lunar.day


def days_until_festival(festival_name, target_year=None):
    if festival_name not in lunar_holidays and festival_name != "除夕":
        print("未识别的节日,请检查输入!")
        return None, None, None

    today = datetime.date.today()

    if target_year is None:
        target_year = today.year

    if festival_name == "除夕":
        # 计算春节日期,然后减去一天得到除夕日期
        lunar_month, lunar_day = lunar_holidays["春节"]
        try:
            lunar_chunjie_date = LunarDate(target_year, lunar_month, lunar_day).toSolarDate()
            lunar_date = lunar_chunjie_date - datetime.timedelta(days=1)
        except ValueError:
            # 如果转换失败,可能是由于闰月的原因,尝试下一年
            lunar_chunjie_date = LunarDate(target_year + 1, lunar_month, lunar_day).toSolarDate()
            lunar_date = lunar_chunjie_date - datetime.timedelta(days=1)
    else:
        lunar_month, lunar_day = lunar_holidays[festival_name]
        try:
            lunar_date = LunarDate(target_year, lunar_month, lunar_day).toSolarDate()
        except ValueError:
            # 如果转换失败,可能是由于闰月的原因,尝试下一年
            lunar_date = LunarDate(target_year + 1, lunar_month, lunar_day).toSolarDate()

    # 如果今天的日期已经过了该节日,则计算下一个年度的节日
    if today > lunar_date:
        print(f"今年的{festival_name}已经过去了,计算明年的时间间隔。")
        if festival_name == "除夕":
            lunar_chunjie_date = LunarDate(target_year + 1, lunar_month, lunar_day).toSolarDate()
            lunar_date = lunar_chunjie_date - datetime.timedelta(days=1)
        else:
            lunar_date = LunarDate(target_year + 1, lunar_month, lunar_day).toSolarDate()
        festival_year = target_year + 1
    else:
        festival_year = target_year

    delta = lunar_date - today
    return festival_year, delta.days, lunar_date


def main():
    while True:
        festival = input("请输入你想查询的农历节日(输入 q 退出):").strip()
        if festival.lower() == 'q':
            print("退出程序。")
            break

        year_input = input("请输入你想要查询的年份(留空则为当前年份):").strip()

        if year_input == "":
            target_year = None
        else:
            try:
                target_year = int(year_input)
            except ValueError:
                print("输入的年份无效,请输入一个有效的整数年份。")
                continue

        festival_year, days_left, festival_date = days_until_festival(festival, target_year)

        if festival_year is not None and days_left is not None and festival_date is not None:
            print(f"{festival_year}年的{festival}对应的阳历日期是:{festival_date.strftime('%Y-%m-%d')}")
            print(f"距离{festival_year}年的{festival}还有 {days_left} 天。\n")
        else:
            print("\n")


if __name__ == "__main__":
    main()
4. 特殊情况处理
4.1 闰月处理

农历中存在闰月的概念,即某些年份会在某个月份之后再插入一个相同的月份。这使得农历与公历之间的转换变得更加复杂。lunardate库内置了对闰月的支持,因此在进行日期转换时,程序能够自动处理闰月的情况,确保计算结果的准确性。

4.2 跨年处理

如果当前日期已经过了当年的节日,程序会自动将计算范围扩展到下一年度。例如,如果今天是2024年12月,而用户查询的是“春节”,程序会自动计算2025年的春节日期。

5. 使用示例,输出结果
请输入你想查询的农历节日(输入 q 退出):除夕
请输入你想要查询的年份(留空则为当前年份):2025
2025年的除夕对应的阳历日期是:2025-01-28
距离2025年的除夕还有 33 天。

请输入你想查询的农历节日(输入 q 退出):春节
请输入你想要查询的年份(留空则为当前年份):2025
2025年的春节对应的阳历日期是:2025-01-29
距离2025年的春节还有 34 天。

请输入你想查询的农历节日(输入 q 退出):元宵节
请输入你想要查询的年份(留空则为当前年份):2025
2025年的元宵节对应的阳历日期是:2025-02-12
距离2025年的元宵节还有 48 天。

请输入你想查询的农历节日(输入 q 退出):q
退出程序。

主要修改点:

  1. days_until_festival 函数
    • 增加了 target_year 参数,允许用户指定要查询的年份。
    • 如果 target_year 为空,则默认使用当前年份。
    • 如果今天的日期已经过了该节日,则提示并计算下一年度的时间间隔。
    • 返回值增加了 lunar_date,即农历节日对应的阳历日期。
    • 不需要直接添加“除夕”,因为它是春节的前一天,可以通过春节日期计算得出。
  2. main 函数
    • 提示用户输入想要查询的年份,并处理可能的输入错误。
    • 如果用户不输入年份,则默认使用当前年份。
    • 保持不变,只是调用 days_until_festival 函数来处理用户输入
    • 在输出中增加了农历节日对应的阳历日期,使用 strftime 方法格式化日期为 YYYY-MM-DD 格式。
    • 使用 while True 循环来持续接受用户输入。
    • 在每次循环中,提示用户输入节日名称,并在用户输入 qQ 时退出循环并结束程序。
    • 每次查询后输出换行符 \n 以提高可读性。

这样,用户可以输入特定的年份来查询该年份的节日距离当前时间的间隔。如果用户不输入年份,则默认使用当前年份进行计算。


参考资料
  • lunardate官方文档
  • Python datetime模块官方文档

欢迎点赞、关注、收藏、转发!!!


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

相关文章:

  • 前端页面上传文件:解决 ERR_UPLOAD_FILE_CHANGED
  • 计算机网络体系结构基础知识
  • Ceph 手动部署(CentOS9)
  • docker compose部署kafka集群
  • [Unity Shader] Unity Shader操作基础:创建一个最简单的顶点/片元着色器
  • JWT包中的源码分析【Golang】
  • 2、Bert论文笔记
  • 基于Spring Boot的可盈保险合同管理系统【附源码】
  • 数据分析的革命——解读云数据库 SelectDB 版的力量
  • 容器化部署服务全流程
  • 小程序租赁系统开发的优势与实践探索
  • 雷电模拟器安装LSPosed
  • 风控模型面试常问问题
  • 计算机专业考研 408 学科学习方法
  • Linux(centos)安装 MySQL 8 数据库(图文详细教程)
  • 进阶岛-L2G5000
  • Kafka 监控都有哪些?
  • 【Golang 面试题】每日 3 题(八)
  • 可视化逻辑表达式编辑器
  • 计算机毕业设计Spark+大模型股票推荐系统 股票预测系统 股票可视化 股票数据分析 量化交易系统 股票爬虫 股票K线图 大数据毕业设计 AI
  • 服务器开发Go语言的算法与数据结构
  • 随身 WiFi 连接 X-Wrt 共享网络与 IPv6 中继配置
  • 深入解析 Tengine:高性能 Web 服务器与反向代理的企业级应用
  • 【每日学点鸿蒙知识】Webview加载内容、router返回问题、Webview定制错误页面、html格式字符串、Toggle高
  • 深入探索Django:常用实用方法指南
  • 2025:Massa重新定义去中心化的一年