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

Python 实现日期计算与日历格式化输出

目录

一、引言

二、需求分析

三、实现思路

四、代码实现

五、代码分析

六、测试与验证

七、总结与展望


         在日常的编程中,我们经常会遇到与日期相关的问题,比如计算两个日期之间的天数差、确定某个特定日期是星期几以及格式化输出日历等。本文将详细介绍如何使用 Python 实现这些功能,并通过一个完整的示例代码进行演示。

一、引言

        日期在我们的生活中无处不在,无论是在项目管理、日程安排还是历史研究等领域,都需要对日期进行准确的计算和处理。Python 作为一种强大的编程语言,提供了丰富的工具和库来处理日期和时间相关的任务。在本文中,我们将使用 Python 的基本语法和逻辑来实现对日期的计算和日历的格式化输出。

二、需求分析

我们的目标是实现以下功能:

  1. 判断给定的年份是否为闰年。
  2. 根据给定的年份和月份,计算该月份的天数。
  3. 计算给定年份和月份距离 1900 年 1 月 1 日的总天数。
  4. 确定给定年份和月份的第一天是星期几。
  5. 格式化输出给定年份和月份的日历。

三、实现思路

  1. 判断闰年

    • 闰年的判断规则是能被 4 整除但不能被 100 整除的年份为闰年,或者能被 400 整除的年份也是闰年。
    • 使用 Python 的条件判断语句来实现这个规则。
  2. 计算月份天数

    • 对于 1、3、5、7、8、10、12 这几个月份,天数为 31 天。
    • 对于 4、6、9、11 这几个月份,天数为 30 天。
    • 对于 2 月份,需要根据是否为闰年来确定天数,闰年为 29 天,非闰年为 28 天。
  3. 计算总天数

    • 首先计算从 1900 年到给定年份之间的总天数,对于闰年的年份,总天数加 366 天,非闰年的年份加 365 天。
    • 然后计算从给定年份的 1 月份到给定月份之间的总天数,根据每个月的天数进行累加。
  4. 确定第一天是星期几

    • 使用总天数对 7 取余,得到的结果即为给定日期是星期几。
    • 根据余数的值进行相应的输出,确定第一天是星期几。
  5. 格式化输出日历

    • 首先输出星期几的表头,即 “星期日 \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("请输入数字")

五、代码分析

  1. 判断闰年函数

    • isLeapYear(year)函数接受一个年份作为参数,使用条件判断语句判断该年份是否为闰年。
    • 如果年份能被 4 整除但不能被 100 整除,或者能被 400 整除,则返回True,表示是闰年;否则返回False,表示不是闰年。
  2. 计算月份天数函数

    • getDayOfMonth(year, month)函数接受年份和月份作为参数,根据月份的不同返回相应的天数。
    • 对于 1、3、5、7、8、10、12 这几个月份,直接返回 31 天。
    • 对于 4、6、9、11 这几个月份,直接返回 30 天。
    • 对于 2 月份,根据是否为闰年调用isLeapYear(year)函数来确定天数,闰年返回 29 天,非闰年返回 28 天。
  3. 主循环部分

    • 使用while True循环,以便用户可以多次输入年份和月份进行计算。
    • 首先接收用户输入的年份,如果用户输入q,则退出循环,打印退出信息。
    • 如果用户输入的是数字,则将其转换为整数类型,并继续接收用户输入的月份。
    • 如果月份输入合法(1-12 之间的数字),则进行日期计算和日历格式化输出。
    • 如果月份输入不合法,则打印错误信息,提示用户重新输入。
  4. 计算总天数部分

    • 首先计算从 1900 年到给定年份之间的总天数,使用一个循环遍历从 1900 年到给定年份之间的每一年,如果是闰年,则总天数加 366 天,非闰年则加 365 天。
    • 然后计算从给定年份的 1 月份到给定月份之间的总天数,使用另一个循环遍历从 1 月份到给定月份之间的每一个月,根据每个月的天数调用getDayOfMonth(year, m)函数进行累加。
  5. 确定第一天是星期几部分

    • 使用总天数加 1 对 7 取余,得到的结果即为给定日期是星期几。
    • 使用match语句根据余数的值进行相应的输出,确定第一天是星期几。
  6. 格式化输出日历部分

    • 首先输出星期几的表头,即 “星期日 \t 星期一 \t 星期二 \t 星期三 \t 星期四 \t 星期五 \t 星期六 \t”。
    • 根据给定月份的第一天是星期几,在输出日期之前先输出相应数量的制表符,以实现对齐。使用counter变量记录已经输出的日期数量,初始值为第一天是星期几的值。
    • 然后循环输出每个日期,每输出一个日期后输出两个制表符,以保持格式整齐。
    • 每输出 7 个日期后进行换行,以实现日历的格式化输出。使用counter变量对 7 取余,当余数为 0 时进行换行。

六、测试与验证

为了验证我们的代码是否正确,我们可以进行以下测试:

  1. 输入合法的年份和月份,检查输出的总天数、第一天是星期几以及日历格式是否正确。
  2. 输入闰年和非闰年的年份,检查 2 月份的天数是否正确。
  3. 输入不合法的年份或月份,检查是否能正确提示用户重新输入。

以下是一些测试示例:

测试 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 实现日期计算与日历格式化输出

目录 一、引言 二、需求分析 三、实现思路 四、代码实现 五、代码分析 六、测试与验证 七、总结与展望 在日常的编程中&#xff0c;我们经常会遇到与日期相关的问题&#xff0c;比如计算两个日期之间的天数差、确定某个特定日期是星期几以及格式化输出日历等。本文将详细…...

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&#xff08;geogrid&#xff0c;WPS所需数据&#xff09; 数据准备&#xff1a;以叶面积指数LAI为例QGis实操&#xff1a;基于GIS4WRF插件将geotiff数据转为tiff警告&#xff1a;GIS4WRF: Input layer had an unexpected …...

python+大数据+基于Hadoop的个性化图书推荐系统【内含源码+文档+部署教程】

博主介绍&#xff1a;✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久&#xff0c;选择我们就是选择放心、选择安心毕业✌ &#x1f345;由于篇幅限制&#xff0c;想要获取完整文章或者源码&#xff0c;或者代做&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 的官方路由管理器&#xff0c;它和 Vue.js 的核心深度集成&#xff0c;让构建单页面应用&#xff08;SPA&#xff09;变得简单。以下是 Vue Router 的基本用法 Vue Router 基本用法 安装 Vue Router 首先&#xff0c;你需要安…...

Linux巡检利器xsos的安装和使用

一、 一般项目基本完成的时候&#xff0c;后期运维工作的重点就是及时的&#xff0c;合理的频率巡检了&#xff0c;巡检的目的主要是及时发现各种各样的问题 那么&#xff0c;自己编写shell脚本是大部分人的第一选择&#xff0c;这里有个比较麻烦的地方&#xff0c;shell脚本…...

Django+Vue项目搭建

一、使用脚手架工具搭建项目 使用脚手架工具搭建Vue项目是一个快速且高效的方式&#xff0c;它能够帮助开发者自动配置好项目所需的环境和依赖。 一、安装Node.js和npm 1、下载Node.js&#xff1a; 前往Node.js官网下载并安装最新版本的Node.js。Node.js是一个基于Ch…...

【NLP自然语言处理】Attention机制原理揭秘:赋予神经网络‘聚焦’与‘理解’的神奇力量

目录 &#x1f354; 注意力机制原理 1.1 注意力机制示意图 1.2 Attention计算过程 1.3 Attention计算逻辑 1.4 有无Attention模型对比 1.4.1 无Attention机制的模型 1.4.2 有Attention机制的模型 &#x1f354; Self-attention演变过程 2.1 Self-attention介绍 2.2 S…...

PHP依赖注入的原理

PHP中的依赖注入&#xff08;Dependency Injection&#xff0c;简称DI&#xff09;是一种设计模式&#xff0c;旨在解耦和管理对象之间的依赖关系&#xff0c;使得代码更加灵活、可测试和可维护。其原理及关键要点如下&#xff1a; 一、原理 依赖注入的原理是通过外部传递依赖…...

文本相似度方案

文章目录 SequenceMatcher余弦相似度基于逆向文档频率向量化 SequenceMatcher from difflib import SequenceMatcher s1 "1.2 章节标题【abc】" s2 "1.2 章节标题【abc】、【she】、【this】" SequenceMatcher(None, s1, s2).ratio() # 0.6666666666666…...

appium 的工作原理

** 安卓&#xff1a; ** 1.1 appuim 基于 uiautomator2 的原理 appium 服务启动后默认在 4723 端口上创建一个 http 服务&#xff0c;脚本通过服务地址 http://xxxx:4723/wd/hub 和 appium 进行通信 在 初 始 化 脚 本 和 appium 连 接 的 过 程 中 appium 会 向 手 机 就 …...

ECharts饼图-富文本标签,附视频讲解与代码下载

引言&#xff1a; 在数据可视化的世界里&#xff0c;ECharts凭借其丰富的图表类型和强大的配置能力&#xff0c;成为了众多开发者的首选。今天&#xff0c;我将带大家一起实现一个饼图图表&#xff0c;通过该图表我们可以直观地展示和分析数据。此外&#xff0c;我还将提供详…...

关于在windows10系统64位安装luasocket问题

luarocks install luasocket 原本以为按下enter键就会一帆风顺&#xff1a;结果事事出人意料之外。 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编码器&#xff1a;PVT-v2-b21.3D-SWSAM&#xff1a;方向-置换加权空间注意力模块1.4KTM&#xff1a;知识转移模块1.5解码器模块 一、GeleNet 论文&#xff1a;Salient Object Detection in Optical Remote Sensing Images Driven by Transformer&#…...

RTE 2024 隐藏攻略

大家好&#xff01;想必今年 RTE 大会议程大家都了解得差不多了&#xff0c;这将是一场实时互动和多模态 AI builder 的年度大聚会。 大会开始前&#xff0c;我们邀请了参与大会策划的 RTE 开发者社区和超音速计划的成员们&#xff0c;分享了不同活动的亮点和隐藏攻略。 请收…...

django 部署服务器后 CSS 样式丢失的问题

原因&#xff1a; nginx除了提供反向代理&#xff0c;负载均衡以外&#xff0c;还提供了静&#xff08;html, css, js&#xff09;动&#xff08;视图&#xff0c;模板需要进行解析执行的&#xff0c;或者操作数据库的&#xff09;分离的功能。 原本django项目中的静态资源存…...

基于springboot的网上服装商城推荐系统的设计与实现

基于springboot的网上服装商城推荐系统的设计与实现 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;idea 源码获取&#xf…...

盘古信息IMS系统助力制造企业释放新质生产力

在全球制造业竞争日益激烈的背景下&#xff0c;提升新质生产力已成为制造企业普遍追求的核心目标。因此&#xff0c;众多制造企业开始对生产流程、管理模式乃至整个企业生态系统进行全面的优化与升级&#xff0c;以期在市场竞争中占据优势地位&#xff0c;迎来更广阔的发展空间…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...