Python 实现日期计算与日历格式化输出(万年历)
目录
一、引言
二、需求分析
三、实现思路
四、代码实现
五、代码分析
六、测试与验证
七、总结与展望
在日常的编程中,我们经常会遇到与日期相关的问题,比如计算两个日期之间的天数差、确定某个特定日期是星期几以及格式化输出日历等。本文将详细介绍如何使用 Python 实现这些功能,并通过一个完整的示例代码进行演示。
一、引言
日期在我们的生活中无处不在,无论是在项目管理、日程安排还是历史研究等领域,都需要对日期进行准确的计算和处理。Python 作为一种强大的编程语言,提供了丰富的工具和库来处理日期和时间相关的任务。在本文中,我们将使用 Python 的基本语法和逻辑来实现对日期的计算和日历的格式化输出。
二、需求分析
我们的目标是实现以下功能:
- 判断给定的年份是否为闰年。
- 根据给定的年份和月份,计算该月份的天数。
- 计算给定年份和月份距离 1900 年 1 月 1 日的总天数。
- 确定给定年份和月份的第一天是星期几。
- 格式化输出给定年份和月份的日历。
三、实现思路
-
判断闰年:
- 闰年的判断规则是能被 4 整除但不能被 100 整除的年份为闰年,或者能被 400 整除的年份也是闰年。
- 使用 Python 的条件判断语句来实现这个规则。
-
计算月份天数:
- 对于 1、3、5、7、8、10、12 这几个月份,天数为 31 天。
- 对于 4、6、9、11 这几个月份,天数为 30 天。
- 对于 2 月份,需要根据是否为闰年来确定天数,闰年为 29 天,非闰年为 28 天。
-
计算总天数:
- 首先计算从 1900 年到给定年份之间的总天数,对于闰年的年份,总天数加 366 天,非闰年的年份加 365 天。
- 然后计算从给定年份的 1 月份到给定月份之间的总天数,根据每个月的天数进行累加。
-
确定第一天是星期几:
- 使用总天数对 7 取余,得到的结果即为给定日期是星期几。
- 根据余数的值进行相应的输出,确定第一天是星期几。
-
格式化输出日历:
- 首先输出星期几的表头,即 “星期日 \t 星期一 \t 星期二 \t 星期三 \t 星期四 \t 星期五 \t 星期六 \t”。
- 根据给定月份的第一天是星期几,在输出日期之前先输出相应数量的制表符,以实现对齐。
- 然后循环输出每个日期,每输出一个日期后输出两个制表符,以保持格式整齐。
- 每输出 7 个日期后进行换行,以实现日历的格式化输出。
四、代码实现
以下是实现上述功能的 Python 代码:
# 判断是否为闰年的
def isLeapYear(year):if year % 4 == 0 and (year % 100!= 0 or year % 400 == 0):return Trueelse:return False# 给定月份,算出来该月份有几天
def getDayOfMonth(year, month):if month == 1 or month == 3 or month == 5 or month == 7 or month == 8 or month == 10 or month == 12:return 31elif month == 4 or month == 6 or month == 9 or month == 11:return 30else:if isLeapYear(year):return 29else:return 28while True:yearStr = input("请输入年份(数字|年份大于 1900)输入 q 退出:")if yearStr == "q":print("你已退出,欢迎下次再来")breakelif yearStr.isdigit():year = int(yearStr)monthStr = input("请输入月份(1-12):")if monthStr.isdigit() and 1 <= int(monthStr) <= 12:month = int(monthStr)# 计算该年月距离 1900-01-01 的总天数totalDays = 0for y in range(1900, year):if isLeapYear(y):totalDays += 366else:totalDays += 365# 将剩余月份的天数相加for m in range(1, month):totalDays += getDayOfMonth(year, m)print(f"{yearStr}年{monthStr}距离 1900-01-01 相差{totalDays}天")# 该年该月的第一天是星期几firstDayOfMonth = (totalDays + 1) % 7match firstDayOfMonth:case 0:print(f"{yearStr}年{monthStr}月的第一天是星期日")case 1:print(f"{yearStr}年{monthStr}月的第一天是星期一")case 2:print(f"{yearStr}年{monthStr}月的第一天是星期二")case 3:print(f"{yearStr}年{monthStr}月的第一天是星期三")case 4:print(f"{yearStr}年{monthStr}月的第一天是星期四")case 5:print(f"{yearStr}年{monthStr}月的第一天是星期五")case 6:print(f"{yearStr}年{monthStr}月的第一天是星期六")# 接着进行格式化输出print("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六\t")# 规律 星期几就打印几个空格# 一个 tab 两个汉字# print("\t"*2)counter = firstDayOfMonthprint("\t" * 2 * firstDayOfMonth, end="")# 打印几号dayOfMonth = getDayOfMonth(year, month)for day in range(1, dayOfMonth + 1):print(day, end="\t\t")counter += 1# 控制换行,没打印 7 个值包括空白都换行if counter % 7 == 0:print()print()else:print("输入的数据不合法,请输入 1~12 之间的数字")else:print("请输入数字")
五、代码分析
-
判断闰年函数:
isLeapYear(year)
函数接受一个年份作为参数,使用条件判断语句判断该年份是否为闰年。- 如果年份能被 4 整除但不能被 100 整除,或者能被 400 整除,则返回
True
,表示是闰年;否则返回False
,表示不是闰年。
-
计算月份天数函数:
getDayOfMonth(year, month)
函数接受年份和月份作为参数,根据月份的不同返回相应的天数。- 对于 1、3、5、7、8、10、12 这几个月份,直接返回 31 天。
- 对于 4、6、9、11 这几个月份,直接返回 30 天。
- 对于 2 月份,根据是否为闰年调用
isLeapYear(year)
函数来确定天数,闰年返回 29 天,非闰年返回 28 天。
-
主循环部分:
- 使用
while True
循环,以便用户可以多次输入年份和月份进行计算。 - 首先接收用户输入的年份,如果用户输入
q
,则退出循环,打印退出信息。 - 如果用户输入的是数字,则将其转换为整数类型,并继续接收用户输入的月份。
- 如果月份输入合法(1-12 之间的数字),则进行日期计算和日历格式化输出。
- 如果月份输入不合法,则打印错误信息,提示用户重新输入。
- 使用
-
计算总天数部分:
- 首先计算从 1900 年到给定年份之间的总天数,使用一个循环遍历从 1900 年到给定年份之间的每一年,如果是闰年,则总天数加 366 天,非闰年则加 365 天。
- 然后计算从给定年份的 1 月份到给定月份之间的总天数,使用另一个循环遍历从 1 月份到给定月份之间的每一个月,根据每个月的天数调用
getDayOfMonth(year, m)
函数进行累加。
-
确定第一天是星期几部分:
- 使用总天数加 1 对 7 取余,得到的结果即为给定日期是星期几。
- 使用
match
语句根据余数的值进行相应的输出,确定第一天是星期几。
-
格式化输出日历部分:
- 首先输出星期几的表头,即 “星期日 \t 星期一 \t 星期二 \t 星期三 \t 星期四 \t 星期五 \t 星期六 \t”。
- 根据给定月份的第一天是星期几,在输出日期之前先输出相应数量的制表符,以实现对齐。使用
counter
变量记录已经输出的日期数量,初始值为第一天是星期几的值。 - 然后循环输出每个日期,每输出一个日期后输出两个制表符,以保持格式整齐。
- 每输出 7 个日期后进行换行,以实现日历的格式化输出。使用
counter
变量对 7 取余,当余数为 0 时进行换行。
六、测试与验证
为了验证我们的代码是否正确,我们可以进行以下测试:
- 输入合法的年份和月份,检查输出的总天数、第一天是星期几以及日历格式是否正确。
- 输入闰年和非闰年的年份,检查 2 月份的天数是否正确。
- 输入不合法的年份或月份,检查是否能正确提示用户重新输入。
以下是一些测试示例:
测试 1:输入 2024 年 10 月
输入:
2024
10
输出:
请输入年份(数字|年份大于1900)输入q退出:2024
请输入月份(1-12):10
2024年10距离 1900-01-01相差45564天
2024年10月的第一天是星期二
星期日 星期一 星期二 星期三 星期四 星期五 星期六 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 31
测试 2:输入 2023 年 2 月
输入:
2023
2
输出:
请输入年份(数字|年份大于1900)输入q退出:2023
请输入月份(1-12):2
2023年2距离 1900-01-01相差44956天
2023年2月的第一天是星期三
星期日 星期一 星期二 星期三 星期四 星期五 星期六 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
测试 3:输入不合法的年份或月份
输入:
abc
10
输出:
请输入年份(数字|年份大于1900)输入q退出:abc
请输入数字
输入:
2024
13
输出:
请输入年份(数字|年份大于1900)输入q退出:2024
请输入月份(1-12):13
输入的数据不合法,请输入1~12之间的数字
测试 4:输入q退出
输入:
q
输出:
请输入年份(数字|年份大于1900)输入q退出:q
你已退出,欢迎下次再来
通过以上测试,我们可以看到代码能够正确地处理各种输入情况,并输出正确的结果。
七、总结与展望
本文介绍了如何使用 Python 实现日期计算和日历格式化输出的功能。通过判断闰年、计算月份天数、计算总天数、确定第一天是星期几以及格式化输出日历等步骤,我们成功地实现了一个简单而实用的日期处理程序。
这个程序可以应用于各种场景,比如日程安排、项目管理、历史研究等。同时,我们也可以对程序进行进一步的扩展和优化,比如添加更多的功能,如计算两个日期之间的间隔天数、判断某个日期是否在特定的时间段内等。
此外,我们还可以使用 Python 的第三方库来处理日期和时间相关的任务,比如datetime
模块和pandas
库等。这些库提供了更强大的功能和更方便的接口,可以大大提高我们的开发效率。
Python 是一种非常强大的编程语言,它提供了丰富的工具和库来处理各种任务。通过本文的介绍,希望读者能够对 Python 的日期处理有更深入的了解,并能够在实际的项目中应用这些知识。
相关文章:
Python 实现日期计算与日历格式化输出(万年历)
目录 一、引言 二、需求分析 三、实现思路 四、代码实现 五、代码分析 六、测试与验证 七、总结与展望 在日常的编程中,我们经常会遇到与日期相关的问题,比如计算两个日期之间的天数差、确定某个特定日期是星期几以及格式化输出日历等。本文将详细…...

10.28.2024刷华为OD C题型
文章目录 HJ9HJ10HJ11HJ13HJ17 HJ9 HJ10 HJ11 HJ13 HJ17...

映射问题的解决办法(mybaitis)
最初我用的是注解来操控数据库(注释掉的部分) Mapper public interface ThreadMapper {// Select("SELECT * FROM thread LIMIT #{page}, #{size}")List<Thread> getListByPage(Param("page") int page, Param("size&qu…...
关于机器学习方向学习的一些建议(过来人)
以下是关于机器学习方向学习的一些建议: 一、扎实的数学基础 线性代数 线性代数是机器学习的基石。矩阵运算在数据表示、模型参数计算等方面无处不在。例如,在多元线性回归中,我们用矩阵来表示自变量和因变量之间的关系。像最小二乘法求解回…...
【云原生】云原生后端:网络架构详解
目录 引言一、微服务间的通信1.1 通信方式概览1.2 HTTP/REST1.3 gRPC1.4 消息队列1.5 GraphQL 二、API网关2.1 API网关架构示例2.2 API网关实现示例 三、服务发现3.1 服务发现实现示例3.2 服务发现的优势 四、网络安全4.1 网络安全最佳实践4.2 网络安全架构示例 总结参考资料 引…...

期货资管子系统框架设计JS路径及源代码分享
期货资管子系统框架设计JS路径及源代码分享 随着期货资管子系统前端技术的飞速发展,JavaScript(JS)及其相关框架已成为构建这类系统的重要工具。本文将详细介绍一个期货资管子系统框架的设计思路,并分享部分JS路径及源代码&#…...

【YOLO 系列】基于YOLO的工业自动化轴承缺陷检测系统【python源码+Pyqt5界面+数据集+训练代码】
前言 轴承作为机械设备中的关键部件,其性能直接影响到设备的稳定性和寿命。轴承缺陷的早期检测对于预防设备故障、减少维护成本和提高生产效率至关重要。然而,传统的轴承缺陷检测方法往往依赖于人工检查,这不仅效率低下,而且容易…...

Word中Normal.dotm样式模板文件
Normal.dotm文档 首先将自己电脑中C:\Users\自己电脑用户名\AppData\Roaming\Microsoft\Templates路径下的Normal.dotm文件做备份,在下载本文中的Normal.dotm文件,进行替换,重新打开word即可使用。 字体样式如下(可自行修改&#…...

生成式 AI 与向量搜索如何扩大零售运营:巨大潜力尚待挖掘
在竞争日益激烈的零售领域,行业领导者始终在探索革新客户体验和优化运营的新途径,而生成式 AI 和向量搜索在这方面将大有可为。从个性化营销到高效库存管理,二者在零售领域的诸多应用场景中都展现出变革性潜力,已成为保持行业领先…...

WonderWorld:斯坦福与 MIT 联手打造实时交互生成图像,单图秒变 3D 虚拟世界
❤️ 如果你也关注大模型与 AI 的发展现状,且对大模型应用开发非常感兴趣,我会快速跟你分享最新的感兴趣的 AI 应用和热点信息,也会不定期分享自己的想法和开源实例,欢迎关注我哦! 🥦 微信公众号ÿ…...

2024年【制冷与空调设备安装修理】考试内容及制冷与空调设备安装修理最新解析
题库来源:安全生产模拟考试一点通公众号小程序 制冷与空调设备安装修理考试内容是安全生产模拟考试一点通总题库中生成的一套制冷与空调设备安装修理最新解析,安全生产模拟考试一点通上制冷与空调设备安装修理作业手机同步练习。2024年【制冷与空调设备…...
PHP const 和 define主要区别
在PHP中,const 和 define 都用于定义常量,但它们有一些关键的区别。以下是它们之间的主要不同点: 定义方式: const:在定义常量时,不需要使用函数形式,而是直接赋值。 const MY_CONSTANT som…...
期中前学习复习总结
期中前终于把每一科的本质给搞明白了。这篇文章也将各学科剖分为两部分。 目录 本质 学法 从问题或条件出发思考问题 从条件出发思考问题 从结论/问题出发思考问题 整理知识与反向押题法 反向押题法 本质 作者是一个理科脑,什么都觉得只要我脑子够新东西我…...

K8S如何基于Istio重新实现微服务
K8S如何基于Istio重新实现微服务 认识 Istio前言Istio 的理念Istio 的架构数据平面控制平面服务与 Istio 的关系 Istio 实践环境准备安装 Helm安装Istio 使用 Istio 代理运行应用情感分析应用的架构使用 Istio 代理运行应用Sidecar 注入Ingress 网关网关资源VirtualService 资源…...

MediaPipe 与 OpenCV 的结合——给心爱的人画一个爱心吧~
目录 概要 实现思路 整体代码实现 效果展示 总结 概要 实时手部检测与绘图应用,通过摄像头捕捉视频流,使用 MediaPipe 识别手部关键点,判断食指是否伸展且其他手指是否弯曲,在满足条件时在画布上绘制圆点,并实时显…...

心觉:成大事,不怕慢,就怕站
Hi,我是心觉,带你用潜意识化解各种焦虑、内耗,建立无敌自信;教你财富精准显化的实操方法;关注我,伴你一路成长! 每日一省写作213/1000天 今天咱们聊聊一个不太花哨,但超重要的话题:…...

练习LabVIEW第二十三题
学习目标: 刚学了LabVIEW,在网上找了些题,练习一下LabVIEW,有不对不好不足的地方欢迎指正! 第二十三题: 建立一个枚举控件,其内容为张三、李四、王五共三位先生,要求当枚举控件显…...

集成对接案例分享:金蝶云与聚水潭数据对接
金蝶云星空与聚水潭的采购入库单数据集成案例分享 在企业信息化管理中,数据的高效流转和准确对接是提升业务效率的关键。本文将深入探讨如何通过轻易云数据集成平台,实现金蝶云星空中的采购入库单数据无缝对接到聚水潭系统中的其他入库单。 本次集成方…...

高级主题-灾难恢复与业务连续性
第一节:灾难恢复与业务连续性 灾难恢复与业务连续性概述 灾难恢复(Disaster Recovery, DR)和业务连续性(Business Continuity, BC)是确保企业能够在遭遇灾难或意外中断后迅速恢复正常运营的关键措施。以下是一些基本…...
R语言实现随机森林分析:从入门到精通
随机森林(Random Forest)是一种流行的机器学习算法,它通过集成多个决策树来提高预测的准确性和鲁棒性。在R语言中,我们可以使用randomForest包来实现随机森林分析。本文将详细介绍如何使用R语言进行随机森林分析,包括数…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...

css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...

用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...

Axure 下拉框联动
实现选省、选完省之后选对应省份下的市区...