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 实现日期计算与日历格式化输出
目录 一、引言 二、需求分析 三、实现思路 四、代码实现 五、代码分析 六、测试与验证 七、总结与展望 在日常的编程中,我们经常会遇到与日期相关的问题,比如计算两个日期之间的天数差、确定某个特定日期是星期几以及格式化输出日历等。本文将详细…...
npm install 安装很慢怎么办?
安装源管理器nrm sudo npm install -g nrm #macOSnpm install -g nrm #Windows以管理员身份运行 安装完毕之后通过以下命令可以切换你想要的源 nrm ls #查看源列表* npm ---------- https://registry.npmjs.org/yarn --------- https://registry.yarnpkg.com/tencent ------…...
【WRF数据处理】基于GIS4WRF插件将geotiff数据转为tiff(geogrid,WPS所需数据)
【WRF数据处理】基于GIS4WRF插件将geotiff数据转为tiff(geogrid,WPS所需数据) 数据准备:以叶面积指数LAI为例QGis实操:基于GIS4WRF插件将geotiff数据转为tiff警告:GIS4WRF: Input layer had an unexpected …...
python+大数据+基于Hadoop的个性化图书推荐系统【内含源码+文档+部署教程】
博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久,选择我们就是选择放心、选择安心毕业✌ 🍅由于篇幅限制,想要获取完整文章或者源码,或者代做&am…...
修改huggingface的缓存目录以及镜像源
执行以下语句查看当前配置 huggingface-cli env默认输出应该如下 (py39-transformers) PS D:\py_project\transformers_demo> huggingface-cli envCopy-and-paste the text below in your GitHub issue.- huggingface_hub version: 0.26.1 - Platform: Windows-10-10.0.22…...
散列表:如何解决哈希表装载因子过高导致的性能下降问题?
散列表:如何解决哈希表装载因子过高导致的性能下降问题? 当哈希表装载因子过高时,会导致性能下降,可以通过以下几种方法来解决: 一、扩容哈希表 (一)原理 当装载因子超过一定阈值时,增加哈希表的大小,然后将现有的元素重新哈希到新的哈希表中。这样可以降低装载因…...
Vue Router进阶学习
各位程序员1024节日快乐~ Vue Router 是 Vue.js 的官方路由管理器,它和 Vue.js 的核心深度集成,让构建单页面应用(SPA)变得简单。以下是 Vue Router 的基本用法 Vue Router 基本用法 安装 Vue Router 首先,你需要安…...
Linux巡检利器xsos的安装和使用
一、 一般项目基本完成的时候,后期运维工作的重点就是及时的,合理的频率巡检了,巡检的目的主要是及时发现各种各样的问题 那么,自己编写shell脚本是大部分人的第一选择,这里有个比较麻烦的地方,shell脚本…...
Django+Vue项目搭建
一、使用脚手架工具搭建项目 使用脚手架工具搭建Vue项目是一个快速且高效的方式,它能够帮助开发者自动配置好项目所需的环境和依赖。 一、安装Node.js和npm 1、下载Node.js: 前往Node.js官网下载并安装最新版本的Node.js。Node.js是一个基于Ch…...
【NLP自然语言处理】Attention机制原理揭秘:赋予神经网络‘聚焦’与‘理解’的神奇力量
目录 🍔 注意力机制原理 1.1 注意力机制示意图 1.2 Attention计算过程 1.3 Attention计算逻辑 1.4 有无Attention模型对比 1.4.1 无Attention机制的模型 1.4.2 有Attention机制的模型 🍔 Self-attention演变过程 2.1 Self-attention介绍 2.2 S…...
PHP依赖注入的原理
PHP中的依赖注入(Dependency Injection,简称DI)是一种设计模式,旨在解耦和管理对象之间的依赖关系,使得代码更加灵活、可测试和可维护。其原理及关键要点如下: 一、原理 依赖注入的原理是通过外部传递依赖…...
文本相似度方案
文章目录 SequenceMatcher余弦相似度基于逆向文档频率向量化 SequenceMatcher from difflib import SequenceMatcher s1 "1.2 章节标题【abc】" s2 "1.2 章节标题【abc】、【she】、【this】" SequenceMatcher(None, s1, s2).ratio() # 0.6666666666666…...
appium 的工作原理
** 安卓: ** 1.1 appuim 基于 uiautomator2 的原理 appium 服务启动后默认在 4723 端口上创建一个 http 服务,脚本通过服务地址 http://xxxx:4723/wd/hub 和 appium 进行通信 在 初 始 化 脚 本 和 appium 连 接 的 过 程 中 appium 会 向 手 机 就 …...
ECharts饼图-富文本标签,附视频讲解与代码下载
引言: 在数据可视化的世界里,ECharts凭借其丰富的图表类型和强大的配置能力,成为了众多开发者的首选。今天,我将带大家一起实现一个饼图图表,通过该图表我们可以直观地展示和分析数据。此外,我还将提供详…...
关于在windows10系统64位安装luasocket问题
luarocks install luasocket 原本以为按下enter键就会一帆风顺:结果事事出人意料之外。 C:\Users\40341>luarocks install luasocket Installing https://luarocks.org/luasocket-3.1.0-1.src.rockluasocket 3.1.0-1 depends on lua > 5.1 (5.4-1 provided …...
模型拆解(二):GeleNet
文章目录 一、GeleNet1.1编码器:PVT-v2-b21.3D-SWSAM:方向-置换加权空间注意力模块1.4KTM:知识转移模块1.5解码器模块 一、GeleNet 论文:Salient Object Detection in Optical Remote Sensing Images Driven by Transformer&#…...
RTE 2024 隐藏攻略
大家好!想必今年 RTE 大会议程大家都了解得差不多了,这将是一场实时互动和多模态 AI builder 的年度大聚会。 大会开始前,我们邀请了参与大会策划的 RTE 开发者社区和超音速计划的成员们,分享了不同活动的亮点和隐藏攻略。 请收…...
django 部署服务器后 CSS 样式丢失的问题
原因: nginx除了提供反向代理,负载均衡以外,还提供了静(html, css, js)动(视图,模板需要进行解析执行的,或者操作数据库的)分离的功能。 原本django项目中的静态资源存…...
基于springboot的网上服装商城推荐系统的设计与实现
基于springboot的网上服装商城推荐系统的设计与实现 开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:idea 源码获取…...
盘古信息IMS系统助力制造企业释放新质生产力
在全球制造业竞争日益激烈的背景下,提升新质生产力已成为制造企业普遍追求的核心目标。因此,众多制造企业开始对生产流程、管理模式乃至整个企业生态系统进行全面的优化与升级,以期在市场竞争中占据优势地位,迎来更广阔的发展空间…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
用鸿蒙HarmonyOS5实现中国象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...
