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

农历节日倒计时:基于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.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
退出程序。

主要修改点:

  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模块官方文档

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

相关文章:

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

农历节日倒计时:基于Python的公历与农历日期转换及节日查询小程序升级版 调整的功能 上一个小程序只是能计算当年的农历节日的间隔时间,那么这次修改一下,任意年份的农历节日都可以,并且能输出农历节日对应的阳历日期&#xff0…...

c语言中void关键字的含义和用法

在 C 语言中&#xff0c;void 是一个特殊的关键字&#xff0c;主要有以下几个用途&#xff1a; 1. 表示函数没有返回值 当一个函数不需要返回任何值时&#xff0c;可以将其返回类型声明为 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刷机时公对公插头掉了&#xff0c;刷机失败&#xff0c;再次刷机&#xff0c;一直提示无法识别的USB设备&#xff0c;此时LED一直不亮&#xff0c;就像是刷成砖了一样&#xff0c;查了好多文章最后发现正面还有一个地方需要短接。 背面的短接点 【免费】玩客云刷机包s805-…...

影刀进阶指令 | Kimi (对标ChatGPT)

文章目录 影刀进阶指令 | Kimi &#xff08;对标ChatGPT&#xff09;一. 需求二. 流程三. 实现3.1 流程概览3.2 流程步骤讲解1\. 确定问题2\. 填写问题并发送3\. 检测答案是否出完 四. 运维 影刀进阶指令 | Kimi &#xff08;对标ChatGPT&#xff09; 简单讲讲RPA调用kimi实现…...

前端项目 node_modules依赖报错解决记录

1.首先尝试解决思路 npm报错就切换yarn &#xff0c; yarn报错就先切换npm删除 node_modules 跟 package-lock.json文件重新下载依 2. 报错信息&#xff1a; Module build failed: Error: Missing binding D:\vue-element-admin\node_modules\node-sass\vendor\win32-x64-8…...

数据科学团队管理

定位&#xff1a; 有核心竞争力的工业算法部门与PM、RD等深度合作 业务方向&#xff1a;(不同产品线&#xff09; 工业预测性维护与数据挖掘视觉检测、OCR 工作内容 项目需求与交付内部框架(frameworks \packages)应用demo专利、竞赛、论文 日常管理 项目管理数据管理(原…...

一个简单的机器学习实战例程,使用Scikit-Learn库来完成一个常见的分类任务——**鸢尾花数据集(Iris Dataset)**的分类

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

攻防世界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延后初始化

目录 实例化网络 小结 到目前为止&#xff0c;我们忽略了建立网络时需要做的以下这些事情&#xff1a; 我们定义了网络架构&#xff0c;但没有指定输入维度。 我们添加层时没有指定前一层的输出维度。 我们在初始化参数时&#xff0c;甚至没有足够的信息来确定模型应该包含…...

Linux | 零基础Ubuntu搭建JDK

目录 软件简介 在线文档 压缩包安装 下载地址 补:传输软件 传输等待 目录结构 解压安装 配置环境 更新环境 测试JDK结果 APT安装 软件简介 Java Development Kit (JDK) 是 Sun 公司&#xff08;已被 Oracle 收购&#xff09;针对 Java 开发员的软件开发工具包。自…...

Android `android.graphics` 包深度解析:架构与设计模式

Android android.graphics 包深度解析:架构与设计模式 目录 引言android.graphics 包概述核心类与架构 CanvasPaintBitmapColorPathShaderMatrix设计模式在 android.graphics 中的应用 工厂模式装饰者模式策略模式享元模式高级图形处理技术 硬件加速离屏渲染自定义 View 中的…...

WPF使用OpenCvSharp4

WPF使用OpenCvSharp4 创建项目安装OpenCvSharp4 创建项目 安装OpenCvSharp4 在解决方案资源管理器中&#xff0c;右键单击项目名称&#xff0c;选择“管理 NuGet 包”。搜索并安装以下包&#xff1a; OpenCvSharp4OpenCvSharp4.ExtensionsOpenCvSharp4.runtime.winSystem.Man…...

你不需要对其他成年人的情绪负责

在这个纷繁复杂的世界里&#xff0c;每个人都是独一无二的个体&#xff0c;背负着各自的故事、梦想与烦恼。在人际交往的广阔舞台上&#xff0c;我们时常会遇到这样的情境&#xff1a;朋友、同事、家人&#xff0c;甚至是陌生人&#xff0c;他们的情绪似乎总能不经意间影响到我…...

25秋招面试总结

秋招从八月底开始&#xff0c;陆陆续续面试了不少&#xff0c;现在也是已经尘埃落定&#xff0c;在这里做一些总结一些我个人的面试经历 腾讯 腾讯是我最早面试的一家&#xff0c;一开始捞我面试的是数字人民币&#xff0c;安全方向的岗位&#xff0c;属于腾讯金融科技这块。…...

高斯核函数(深入浅出)

目录 定义及数学形式主要特点应用示例小结 高斯核函数&#xff08;Gaussian Kernel&#xff09;&#xff0c;又称径向基核&#xff08;Radial Basis Function Kernel&#xff0c;RBF Kernel&#xff09;&#xff0c;是机器学习与模式识别中最常用的核函数之一。它通过在高维空间…...

支付宝百宝箱 工具,快速上手制作一个agent

作品&#xff1a;历史上的今天-作文素材积累 Datawhale 动手学AI Agent 关键词&#xff1a;AI助手开发、LangGPT框架 链接&#xff1a;百宝箱百宝箱平台是一款可以提供一站式 AI 原生应用的开发平台&#xff0c;您无需具有任何代码基础&#xff0c;只需通过自然语言即可三步完…...

六十:HTTP/2与gRPC框架

随着互联网技术的发展&#xff0c;应用程序之间的通信需求日益复杂和多样化。传统的HTTP/1.x协议虽然广泛应用&#xff0c;但在性能和功能方面已经难以满足现代应用的需求。为了解决这些问题&#xff0c;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 文件来设置开发服务器的代理规则&#xff1a; // vue.config.js mod…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...

《信号与系统》第 6 章 信号与系统的时域和频域特性

目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...