农历节日倒计时:基于Python的公历与农历日期转换及节日查询小程序
农历节日倒计时:基于Python的公历与农历日期转换及节日查询小程序
摘要
又是一年春节即将到来,突然想基于Python编写一个农历节日的倒计时小程序。该程序能够根据用户输入的农历节日名称,计算出距离该节日还有多少天。通过使用lunardate库进行公历与农历之间的日期转换,程序可以处理闰月等特殊情况,并提供准确的倒计时结果。本文将详细介绍程序的功能、实现原理以及代码结构。
1. 引言
农历是中国传统历法,许多重要的节日如春节、端午节、中秋节等都基于农历日期。然而,由于农历与公历之间的差异(尤其是闰月的存在),直接通过公历日期来计算这些节日的具体时间并不容易。为了帮助用户更方便地了解即将到来的农历节日,开发了这款基于Python的农历节日倒计时程序。
2. 功能概述
该程序的主要功能包括:
- 农历节日查询:用户可以通过输入农历节日名称(如“春节”、“端午节”等),查询该节日对应的公历日期。
- 倒计时计算:程序会根据当前日期,计算距离下一个该节日还有多少天。
- 闰月处理:程序能够自动处理闰月的情况,确保计算结果的准确性。
- 跨年处理:如果当前日期已经过了当年的节日,程序会自动计算下一年度的节日日期。
3. 技术实现
3.1 核心库:lunardate
程序依赖于lunardate库来进行公历与农历之间的日期转换。lunardate是一个轻量级的Python库,支持农历和公历之间的相互转换,并且能够正确处理闰月问题。通过该库,我们可以轻松获取任意农历日期对应的公历日期,反之亦然。
3.2 程序结构
程序的核心逻辑分为以下几个部分:
-
定义农历节日字典:
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, current_year=None):if festival_name not in lunar_holidays:print("未识别的节日,请检查输入!")return None, Nonetoday = datetime.date.today()if current_year is None:current_year = today.yearlunar_month, lunar_day = lunar_holidays[festival_name]try:lunar_date = LunarDate(current_year, lunar_month, lunar_day).toSolarDate()except ValueError:lunar_date = LunarDate(current_year + 1, lunar_month, lunar_day).toSolarDate()if today > lunar_date:lunar_date = LunarDate(current_year + 1, lunar_month, lunar_day).toSolarDate()festival_year = current_year + 1else:festival_year = current_yeardelta = lunar_date - todayreturn festival_year, delta.days该函数是程序的核心逻辑,它根据用户输入的节日名称,计算出距离该节日还有多少天。如果当前日期已经过了该节日,则会自动计算下一年度的节日日期。
-
主程序入口:
def main():festival = input("请输入你想查询的农历节日:")festival_year, days_left = days_until_festival(festival)if festival_year is not None and days_left is not None:print(f"距离{festival_year}年的{festival}还有 {days_left} 天。")主程序通过命令行接收用户输入的节日名称,调用
days_until_festival函数进行计算,并输出结果。
4. 特殊情况处理
4.1 闰月处理
农历中存在闰月的概念,即某些年份会在某个月份之后再插入一个相同的月份。这使得农历与公历之间的转换变得更加复杂。lunardate库内置了对闰月的支持,因此在进行日期转换时,程序能够自动处理闰月的情况,确保计算结果的准确性。
4.2 跨年处理
如果当前日期已经过了当年的节日,程序会自动将计算范围扩展到下一年度。例如,如果今天是2024年12月,而用户查询的是“春节”,程序会自动计算2025年的春节日期。
5. 使用示例
假设今天是2024年12月25日,用户输入“中秋节”。程序会首先检查当前日期是否已经过了2025年的中秋节(2025年10月6日),然后计算出距离2025年中秋节(2025年10月6日)还有多少天。最终输出结果如下:
请输入你想查询的农历节日:春节
距离2025年的春节还有 34 天。
6. 总结
本文介绍了一款基于Python的农历节日倒计时程序,该程序利用lunardate库实现了公历与农历之间的日期转换,并提供了农历节日的倒计时功能。通过处理闰月和跨年等情况,程序能够准确地计算出距离指定节日的时间,为用户提供便捷的节日查询服务。
未来,该程序还可以进一步扩展,例如增加更多的农历节日、支持更多地区的农历习俗等,以满足更广泛的需求。
参考资料
- lunardate官方文档
- Python
datetime模块官方文档
欢迎点赞、关注、收藏、转发!!!
相关文章:
农历节日倒计时:基于Python的公历与农历日期转换及节日查询小程序
农历节日倒计时:基于Python的公历与农历日期转换及节日查询小程序 摘要 又是一年春节即将到来,突然想基于Python编写一个农历节日的倒计时小程序。该程序能够根据用户输入的农历节日名称,计算出距离该节日还有多少天。通过使用lunardate库进…...
【RabbitMQ的死信队列】
死信队列 什么是死信队列死信队列的配置方式死信消息结构 什么是死信队列 消息被消费者确认拒绝。消费者把requeue参数设置为true(false),并且在消费后,向RabbitMQ返回拒绝。channel.basicReject或者channel.basicNack。消息达到预设的TTL时限还一直没有…...
掌握软件工程基础:知识点全面解析【chap02】
chap02 软件项目管理 1.代码行度量与功能点度量的比较 1.规模度量 是一种直接度量方法。 代码行数 LOC或KLOC 生产率 P1L/E 其中 L 软件项目代码行数 E 软件项目工作量(人月 PM) P1 软件项目生产率(LOC/PM) 代码出错…...
公路边坡安全监测中智能化+定制化+全面守护的应用方案
面对公路边坡的安全挑战,我们如何精准施策,有效应对风险?特别是在强降雨等极端天气下,如何防范滑坡、崩塌、路面塌陷等灾害,确保行车安全?国信华源公路边坡安全监测解决方案,以智能化、定制化为…...
闲谭Scala(3)--使用IDEA开发Scala
1. 背景 广阔天地、大有作为的青年,怎么可能仅仅满足于命令行。 高端大气集成开发环境IDEA必须顶上,提高学习、工作效率。 开整。 2. 步骤 2.1 创建工程 打开IDEA,依次File-New-Project…,不好意思我的是中文版:…...
Go语言反射从入门到进阶
一、反射的基础概念 在 Go 语言中,反射是程序在运行时检查和修改自身状态的能力。通过反射,我们可以在运行时获取变量的类型信息、查看结构体的字段、调用方法等。Go 语言的反射功能主要通过 reflect 包实现。 1.1 反射的基本类型:Type 和 …...
【基于rust-wasm的前端页面转pdf组件和示例】
基于rust-wasm前端页面转pdf组件和示例 朔源多余的废话花哨的吹牛那点东西要不要拿来试试事到如今 做个美梦 我觉得本文的意义在于,wasm扩展了浏览器的边界,但是又担心如同java的web applet水土不服. 如同我至今看不出塞班和iOS的不同下载地址:在github的备份 朔源…...
ARM64 Windows 10 IoT工控主板运行x86程序效率测试
ARM上的 Windows 10 IoT 企业版支持仿真 x86 应用程序,而 ARM上的 Windows 11 IoT 企业版则支持仿真 x86 和 x64 应用程序。英创推出的名片尺寸ARM64工控主板ESM8400,可预装正版Windows 10 IoT企业版操作系统,x86程序可无需修改而直接在ESM84…...
开放世界目标检测 Grounding DINO
开放世界目标检测 Grounding DINO flyfish Grounding DINO 是一种开创性的开放集对象检测器,它通过结合基于Transformer的检测器DINO与基于文本描述的预训练技术,实现了可以根据人类输入(如类别名称或指代表达)检测任意对象的功…...
easegen将教材批量生成可控ppt课件方案设计
之前客户提出过一个需求,就是希望可以将一本教材,快速的转换为教学ppt,虽然通过人工程序脚本的方式,已经实现了该功能,但是因为没有做到通用,每次都需要修改脚本,无法让客户自行完成所有流程&am…...
2002 - Can‘t connect to server on ‘192.168.1.XX‘ (36)
参考:2002 - Can‘t connect to server on ‘192.168.1.XX‘ (36) ubantu20.04,mysql5.7.13 navicat 远程连接数据库报错 2002 - Can’t connect to server on ‘192.168.1.61’ (36) 一、查看数据库服务是否有启动,发现有启动 systemctl status mysql…...
【虚拟机网络拓扑记录】
虚拟机网络拓扑记录 虚拟机安装windows到ubuntu的网络拓扑ubuntu到ubuntu里面的虚拟机网络拓扑windows到ubuntu里面的虚拟机网络拓扑 虚拟机安装 本实验宿主机为windos, 安装vmware,虚拟机操作系统使用ubuntu,然后再在ubuntu上面创建新的虚拟…...
【单片机通讯协议】—— 常用的UART/I2C/SPI等通讯协议的基本原理与时序分析
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、通信基本知识1.1 MCU的参见外设1.2 通信的分类按基本的类型从传输方向上来分 二、UART(串口通讯)2.1 简介2.2 时序图分析2.3 UART的…...
Vue3 核心语法
1. OptionsAPI 与 CompositionAPI Vue2 的API设计是 Options(配置)风格的。Vue3 的API设计是 Composition(组合)风格的。 1.1 Options API 的弊端 Options类型的 API,数据、方法、计算属性等,是分散在&a…...
LLaMA-Factory GLM4-9B-CHAT LoRA 指令微调实战
🤩LLaMA-Factory GLM LoRA 微调 安装llama-factory包 git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git进入下载好的llama-factory,安装依赖包 cd LLaMA-Factory pip install -e ".[torch,metrics]" #上面这步操作会完成…...
GTM023 W.H.Greub线性代数经典教材:Linear Algebra
这本教材是我高中时期入门线性代数的主要教材,我的很多基础知识都来源于这本书,如今看回这本书可以说满满的回忆。这本书可以说,是我读过的内容最为全面且完备的线性代数教材了。而且它的语言风格非常的代数化,没有什么直观可言&a…...
交换机与路由器的区别
交换机和路由器是网络中的两种关键设备,它们各自承担不同的功能,主要区别体现在以下几个方面: 一、工作层次与功能 交换机: 工作层次:交换机主要工作在OSI模型的第二层,即数据链路层。 功能:交…...
springboot502基于WEB的牙科诊所管理系统(论文+源码)_kaic
牙科诊所管理系统的设计与实现 摘要 近年来,信息化管理行业的不断兴起,使得人们的日常生活越来越离不开计算机和互联网技术。首先,根据收集到的用户需求分析,对设计系统有一个初步的认识与了解,确定牙科诊所管理系统的…...
soular使用教程
用 soular 配置你的组织,工作更高效!以下是快速上手的简单步骤:  1. 账号管理 可以对账号信息进行多方面管理,包括分配不同的部门、用户组等,从而确保账号权限和职责的清晰分配。  1.1 用…...
纯div+css+js弹出窗
目的:实现弹出窗、仅关闭弹窗之后才能操作。自适应宽度与高度、当文本内容太多时、添加滚动条效果。 效果图 源码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport"…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
C++--string的模拟实现
一,引言 string的模拟实现是只对string对象中给的主要功能经行模拟实现,其目的是加强对string的底层了解,以便于在以后的学习或者工作中更加熟练的使用string。本文中的代码仅供参考并不唯一。 二,默认成员函数 string主要有三个成员变量,…...
STM32标准库-ADC数模转换器
文章目录 一、ADC1.1简介1. 2逐次逼近型ADC1.3ADC框图1.4ADC基本结构1.4.1 信号 “上车点”:输入模块(GPIO、温度、V_REFINT)1.4.2 信号 “调度站”:多路开关1.4.3 信号 “加工厂”:ADC 转换器(规则组 注入…...
【大模型】RankRAG:基于大模型的上下文排序与检索增强生成的统一框架
文章目录 A 论文出处B 背景B.1 背景介绍B.2 问题提出B.3 创新点 C 模型结构C.1 指令微调阶段C.2 排名与生成的总和指令微调阶段C.3 RankRAG推理:检索-重排-生成 D 实验设计E 个人总结 A 论文出处 论文题目:RankRAG:Unifying Context Ranking…...
