农历节日倒计时:基于Python的公历与农历日期转换及节日查询小程序(升级版)
农历节日倒计时:基于Python的公历与农历日期转换及节日查询小程序升级版
调整的功能
上一个小程序只是能计算当年的农历节日的间隔时间,那么这次修改一下,任意年份的农历节日都可以,并且能输出农历节日对应的阳历日期,而且可以循环输入,直到输入q退出。
1. 引言
农历是中国传统历法,许多重要的节日如春节、端午节、中秋节等都基于农历日期。然而,由于农历与公历之间的差异(尤其是闰月的存在),直接通过公历日期来计算这些节日的具体时间并不容易。为了帮助用户更方便地了解即将到来的农历节日,开发了这款基于Python的农历节日倒计时程序。
2. 功能概述
该程序的主要功能包括:
- 农历节日查询:用户可以通过输入农历节日名称(如“春节”、“端午节”等),查询该节日对应的公历日期。
- 倒计时计算:程序会根据当前日期,计算距离下一个该节日还有多少天。
- 闰月处理:程序能够自动处理闰月的情况,确保计算结果的准确性。
- 跨年处理:如果当前日期已经过了当年的节日,程序会自动计算下一年度的节日日期。
3. 技术实现
3.1 核心库:lunardate
程序依赖于lunardate
库来进行公历与农历之间的日期转换。lunardate
是一个轻量级的Python库,支持农历和公历之间的相互转换,并且能够正确处理闰月问题。通过该库,我们可以轻松获取任意农历日期对应的公历日期,反之亦然。
- 程序源码:
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.daydef days_until_festival(festival_name, target_year=None):if festival_name not in lunar_holidays and festival_name != "除夕":print("未识别的节日,请检查输入!")return None, None, Nonetoday = datetime.date.today()if target_year is None:target_year = today.yearif 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 + 1else:festival_year = target_yeardelta = lunar_date - todayreturn festival_year, delta.days, lunar_datedef main():while True:festival = input("请输入你想查询的农历节日(输入 q 退出):").strip()if festival.lower() == 'q':print("退出程序。")breakyear_input = input("请输入你想要查询的年份(留空则为当前年份):").strip()if year_input == "":target_year = Noneelse:try:target_year = int(year_input)except ValueError:print("输入的年份无效,请输入一个有效的整数年份。")continuefestival_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
退出程序。
主要修改点:
days_until_festival
函数:- 增加了
target_year
参数,允许用户指定要查询的年份。 - 如果
target_year
为空,则默认使用当前年份。 - 如果今天的日期已经过了该节日,则提示并计算下一年度的时间间隔。
- 返回值增加了
lunar_date
,即农历节日对应的阳历日期。 - 不需要直接添加“除夕”,因为它是春节的前一天,可以通过春节日期计算得出。
- 增加了
main
函数:- 提示用户输入想要查询的年份,并处理可能的输入错误。
- 如果用户不输入年份,则默认使用当前年份。
- 保持不变,只是调用
days_until_festival
函数来处理用户输入 - 在输出中增加了农历节日对应的阳历日期,使用
strftime
方法格式化日期为YYYY-MM-DD
格式。 - 使用
while True
循环来持续接受用户输入。 - 在每次循环中,提示用户输入节日名称,并在用户输入
q
或Q
时退出循环并结束程序。 - 每次查询后输出换行符
\n
以提高可读性。
这样,用户可以输入特定的年份来查询该年份的节日距离当前时间的间隔。如果用户不输入年份,则默认使用当前年份进行计算。
参考资料
- lunardate官方文档
- Python
datetime
模块官方文档
欢迎点赞、关注、收藏、转发!!!
相关文章:
农历节日倒计时:基于Python的公历与农历日期转换及节日查询小程序(升级版)
农历节日倒计时:基于Python的公历与农历日期转换及节日查询小程序升级版 调整的功能 上一个小程序只是能计算当年的农历节日的间隔时间,那么这次修改一下,任意年份的农历节日都可以,并且能输出农历节日对应的阳历日期࿰…...
c语言中void关键字的含义和用法
在 C 语言中,void 是一个特殊的关键字,主要有以下几个用途: 1. 表示函数没有返回值 当一个函数不需要返回任何值时,可以将其返回类型声明为 void。 #include <stdio.h>void printMessage() {printf("Hello, World!\…...
安卓音频之dumpsys audio
目录 概述 详述 dumpsys audio 1、音频服务生命周期的事件日志 2、音频焦点事件日志 3、音频流音量信息 4、音量组和设备的相关信息 5、铃声模式 6、音频路由 7、其他状态信息 8、播放活动监控信息 9、录音活动记录 10、AudioDeviceBroker 的记录 11、音效&#…...

玩客云v1.0 刷机时无法识别USB
v1.0刷机时公对公插头掉了,刷机失败,再次刷机,一直提示无法识别的USB设备,此时LED一直不亮,就像是刷成砖了一样,查了好多文章最后发现正面还有一个地方需要短接。 背面的短接点 【免费】玩客云刷机包s805-…...

影刀进阶指令 | Kimi (对标ChatGPT)
文章目录 影刀进阶指令 | Kimi (对标ChatGPT)一. 需求二. 流程三. 实现3.1 流程概览3.2 流程步骤讲解1\. 确定问题2\. 填写问题并发送3\. 检测答案是否出完 四. 运维 影刀进阶指令 | Kimi (对标ChatGPT) 简单讲讲RPA调用kimi实现…...
前端项目 node_modules依赖报错解决记录
1.首先尝试解决思路 npm报错就切换yarn , yarn报错就先切换npm删除 node_modules 跟 package-lock.json文件重新下载依 2. 报错信息: Module build failed: Error: Missing binding D:\vue-element-admin\node_modules\node-sass\vendor\win32-x64-8…...
数据科学团队管理
定位: 有核心竞争力的工业算法部门与PM、RD等深度合作 业务方向:(不同产品线) 工业预测性维护与数据挖掘视觉检测、OCR 工作内容 项目需求与交付内部框架(frameworks \packages)应用demo专利、竞赛、论文 日常管理 项目管理数据管理(原…...

一个简单的机器学习实战例程,使用Scikit-Learn库来完成一个常见的分类任务——**鸢尾花数据集(Iris Dataset)**的分类
机器学习实战通常是将理论与实践结合,通过实际的项目或案例,帮助你理解并应用各种机器学习算法。下面是一个简单的机器学习实战例程,使用Scikit-Learn库来完成一个常见的分类任务——**鸢尾花数据集(Iris Dataset)**的…...

攻防世界web第二题unseping
这是题目 <?php highlight_file(__FILE__);class ease{private $method;private $args;function __construct($method, $args) {$this->method $method;$this->args $args;}function __destruct(){if (in_array($this->method, array("ping"))) {cal…...
动手学深度学习-深度学习计算-3延后初始化
目录 实例化网络 小结 到目前为止,我们忽略了建立网络时需要做的以下这些事情: 我们定义了网络架构,但没有指定输入维度。 我们添加层时没有指定前一层的输出维度。 我们在初始化参数时,甚至没有足够的信息来确定模型应该包含…...

Linux | 零基础Ubuntu搭建JDK
目录 软件简介 在线文档 压缩包安装 下载地址 补:传输软件 传输等待 目录结构 解压安装 配置环境 更新环境 测试JDK结果 APT安装 软件简介 Java Development Kit (JDK) 是 Sun 公司(已被 Oracle 收购)针对 Java 开发员的软件开发工具包。自…...
Android `android.graphics` 包深度解析:架构与设计模式
Android android.graphics 包深度解析:架构与设计模式 目录 引言android.graphics 包概述核心类与架构 CanvasPaintBitmapColorPathShaderMatrix设计模式在 android.graphics 中的应用 工厂模式装饰者模式策略模式享元模式高级图形处理技术 硬件加速离屏渲染自定义 View 中的…...

WPF使用OpenCvSharp4
WPF使用OpenCvSharp4 创建项目安装OpenCvSharp4 创建项目 安装OpenCvSharp4 在解决方案资源管理器中,右键单击项目名称,选择“管理 NuGet 包”。搜索并安装以下包: OpenCvSharp4OpenCvSharp4.ExtensionsOpenCvSharp4.runtime.winSystem.Man…...
你不需要对其他成年人的情绪负责
在这个纷繁复杂的世界里,每个人都是独一无二的个体,背负着各自的故事、梦想与烦恼。在人际交往的广阔舞台上,我们时常会遇到这样的情境:朋友、同事、家人,甚至是陌生人,他们的情绪似乎总能不经意间影响到我…...
25秋招面试总结
秋招从八月底开始,陆陆续续面试了不少,现在也是已经尘埃落定,在这里做一些总结一些我个人的面试经历 腾讯 腾讯是我最早面试的一家,一开始捞我面试的是数字人民币,安全方向的岗位,属于腾讯金融科技这块。…...
高斯核函数(深入浅出)
目录 定义及数学形式主要特点应用示例小结 高斯核函数(Gaussian Kernel),又称径向基核(Radial Basis Function Kernel,RBF Kernel),是机器学习与模式识别中最常用的核函数之一。它通过在高维空间…...

支付宝百宝箱 工具,快速上手制作一个agent
作品:历史上的今天-作文素材积累 Datawhale 动手学AI Agent 关键词:AI助手开发、LangGPT框架 链接:百宝箱百宝箱平台是一款可以提供一站式 AI 原生应用的开发平台,您无需具有任何代码基础,只需通过自然语言即可三步完…...
六十:HTTP/2与gRPC框架
随着互联网技术的发展,应用程序之间的通信需求日益复杂和多样化。传统的HTTP/1.x协议虽然广泛应用,但在性能和功能方面已经难以满足现代应用的需求。为了解决这些问题,HTTP/2协议和基于其之上的gRPC框架应运而生。本文将介绍HTTP/2协议的特点…...
1.RPC基本原理
文章目录 RPC1.定义2.概念3.优缺点4.RPC结构5.RPC消息协议5.1 消息边界5.2 内容5.3 压缩 6.RPC的实现6.1 divide_protocol.py6.2 server.py6.3 client.py RPC 1.定义 远程过程调用(remote procedure call) 2.概念 广义:所有通过网络进行通讯,的调用统称为RPC调用 狭义:不采…...
vue2/3,Spring Boot以及生产环境跨域解决方案
vue2和vue3跨域解决方案 Vue 2 (基于 Webpack) 的跨域解决方案 1. 创建或编辑 vue.config.js 文件 Vue CLI为Webpack项目提供了简单的代理配置方式。你可以通过创建或编辑项目的根目录下的 vue.config.js 文件来设置开发服务器的代理规则: // vue.config.js mod…...

多模态大语言模型arxiv论文略读(112)
Assessing Modality Bias in Video Question Answering Benchmarks with Multimodal Large Language Models ➡️ 论文标题:Assessing Modality Bias in Video Question Answering Benchmarks with Multimodal Large Language Models ➡️ 论文作者:Jea…...
创客匠人:如何通过创始人IP打造实现知识变现与IP变现的长效增长?
在流量红利逐渐消退的当下,创始人IP的价值愈发凸显。它不仅能够帮助中小企业及个人创业者突破竞争壁垒,还能成为企业品牌影响力的核心资产。然而,市场上IP孵化机构鱼龙混杂,如何选择一家真正具备长期价值的合作伙伴?创…...
Git 切换到旧提交,同时保证当前修改不丢失
在 Git 中,可以通过以下几种方式切换到之前的提交,同时保留当前的修改 1. 使用 git checkout 创建临时分离头指针(推荐用于查看代码) git checkout <commit-hash>这会让你进入"分离头指针"状态,你可…...
DeepSeek11-Ollama + Open WebUI 搭建本地 RAG 知识库全流程指南
🛠️ Ollama Open WebUI 搭建本地 RAG 知识库全流程指南 💻 一、环境准备 # 1. 安装 Docker 和 Docker Compose sudo apt update && sudo apt install docker.io docker-compose -y# 2. 添加用户到 docker 组(避免 sudo 权限&…...

MQTT协议:物联网时代的通信基石
MQTT协议:物联网时代的通信基石 在当今快速发展的物联网(IoT)时代,设备之间的通信变得尤为重要。MQTT(Message Queuing Telemetry Transport)协议作为一种轻量级的消息传输协议,正逐渐成为物联…...

【五子棋在线对战】三.数据管理模块实现
数据管理模块实现 1.数据库表的设计2.数据管理模块的封装和实现2.1 user_table() && ~user_table()2.2 insert() 注册时新增用户2.3 login() 登录验证,并返回详细的用户信息2.4 通过用户名获取用户信息 && 通过用户id获取用户信息2.5 win() &&a…...

关于智能体API参考接口
关于智能体在Flask的源码:请求体(在payload里的是请求体)、请求头(在headers里的i局势请求头)。 我的例子: 我的疑问:为什么没按Coze官方API文档格式,在Apifox里发POST请求却能收到回复? 1. 你…...

【第三十九周】ViLT
ViLT 摘要Abstract文章信息介绍提取视觉特征的方式的演变模态融合的两种方式四种不同的 VLP 模型Q&A 方法模型结构目标函数Whole Word Masking(WWM) 实验结果总结 摘要 本篇博客介绍了ViLT(Vision-and-Language Transformer)…...
Linux 用户层 和 内核层锁的实现
目录 一、系统调用futex介绍1. 核心机制2. 常见操作3. 工作流程示例(互斥锁)4. 优势5. 注意事项6. 典型应用 二、Linux中用户态的锁和内核的锁不是同一个实现吗?2.1 本质区别2.2 用户态锁如何工作(以 pthread_mutex 为例ÿ…...
LLMs之Structured Output:vLLM 结构化输出指南—从约束生成到自动解析与高效实现
LLMs之Structured Output:vLLM 结构化输出指南—从约束生成到自动解析与高效实现 导读:随着大语言模型(LLM)在各类任务中的广泛应用,如何使其输出具备可控性、结构化与可解析性,成为实际部署中的关键问题。…...