当前位置: 首页 > 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;迎来更广阔的发展空间…...

ArcGIS 10.8 安装教程

目录 一、ArcGIS10.8二、安装链接三、安装教程四、ArcGIS实战 &#xff08;一&#xff09;ArcGIS10.8 1. 概述 ArcGIS 10.8是由美国Esri公司开发的GIS平台&#xff0c;用于处理、分析、显示和管理地理数据&#xff0c;并实现数据共享。它具有新特性和功能&#xff0c;性能更…...

Redis学习笔记(二)--Redis的安装与配置

文章目录 一、Redis的安装1、克隆并配置主机2、安装前的准备工作1.安装gcc2.下载Redis3.上传到Linux 3、安装Redis1.解压Redis2.编译3.安装3.查看bin目录 4、Redis启动与停止1.前台启动2.命令式后台启动3.Redis的停止4.配置式后台启动 二、连接前的配置1、绑定客户端IP2、关闭保…...

软件工程之软件系统设计与软件开发方法

一.软件系统设计 1.体系结构设计就是架构设计&#xff0c;软件设计包含4个方面&#xff1a; 接口&#xff08;人机界面设计&#xff09;设计&#xff1a;软件与操作系统、软件与人之间如何交互&#xff1b; 架构&#xff08;结构&#xff09;设计&#xff1a;定义软件系统各…...

pip命令行安装pytest 一直报错

其实就是切换不同镜像安装 我最终成功的是阿里云镜像 pip install --trusted-host mirrors.aliyun.com pytest 也可以用其他的 pip install -i https://pypi.org/simple pytest # 或者使用其他的镜像源 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pytest...

如何在Debian操作系统上安装Doker

本章教程&#xff0c;主要介绍如何在Debian 11 系统上安装Docker。主要使用一键安装Docker脚本和一键卸载脚本来完成。 一、安装Docker #!/bin/bashRED\033[0;31m GREEN\033[0;32m YELLOW\033[0;33m BLUE\033[0;34m NC\033[0mCURRENT_DIR$(cd "$(dirname "$0")…...

代码随想录刷题学习日记

仅为个人记录复盘学习历程&#xff0c;解题思路来自代码随想录 代码随想录刷题笔记总结网址:代码随想录 二叉树的迭代遍历(不使用递归实现遍历) 递归的实现就是&#xff1a;每一次递归调用都会把函数的局部变量、参数值和返回地址等压入调用栈中&#xff0c;递归是通过栈实现…...

OpenText ALM Octane,为您的 DevOps 管道提供质量保证

实现更高水平的敏捷性、可追溯性和可预测性是一个持续的过程。ALM Octane 可帮助您改进开发和测试流程&#xff0c;从而改善整个软件交付价值流中的工作流程。 产品亮点 对基于软件的创新的需求已经加速&#xff0c;扰乱了几乎每个行业&#xff0c;也改变了我们的生活。快速交…...

【python实操】python小程序之参数化以及Assert(断言)

引言 python小程序之参数化以及Assert&#xff08;断言&#xff09; 文章目录 引言一、参数化2.1 题目2.2 代码2.3 代码解释 二、Assert&#xff08;断言&#xff09;2.1 概念2.1.1 Assert语句的基本语法&#xff1a;2.1.2 基本断言2.1.3 断言函数参数2.1.4 断言前后状态一致 2…...

探索CSS动画下的按钮交互美学

效果演示 这段代码通过SVG和CSS动画创建了一个具有视觉吸引力的按钮&#xff0c;当用户与按钮交互时&#xff08;如悬停、聚焦或按下&#xff09;&#xff0c;按钮会显示不同的动画效果。 HTML <button class"button"><div class"dots_border"…...

241024-Ragflow离线部署Docker-Rootless环境配置修改

A. 最终效果 B. 文件修改 docker-compose.yml include:- path: ./docker-compose-base.ymlenv_file: ./.envservices:ragflow:depends_on:mysql:condition: service_healthyes01:condition: service_healthyimage: ${RAGFLOW_IMAGE}container_name: ragflow-serverports:- ${…...

皮卡剧网站怎样做/域名查询ip爱站网

这是我的服务器端代码在Java监听1880端口&#xff0c;并从浏览器/ client.java代码在本地主机&#xff0c;它给连接拒绝error.I复制该服务器代码从网页。我不知道这是什么代码在做。如何在java中监听和生成服务器端的客户端响应&#xff1f;import com.sun.net.httpserver.Http…...

手机怎么建网站/杭州优化公司在线留言

The following are some english patterns I’ve learned today. Iwrote down them in order to restudy later. 1. have a bone in one’s throat 难以启齿 2. Don’t take it to heart. 别往心里去。 3. I just couldn’t help it. 我只是控制不住。 4. Let’s face it. 面对…...

wordpress 添加文章/推广app拿返佣的平台

说起沟通科技&#xff0c;也许一般人会觉得很陌生&#xff0c;毕竟这家成立于2000年的高新企业&#xff0c;前几年一直比较沉寂&#xff0c;在默默无闻地做着前期的铺垫工作&#xff0c;但对于应用软件和远程接入这些相关的行业而言&#xff0c;从2005年开始&#xff0c;沟通科…...

天津网站建设电话/网站建设策划书

hyperledger fabric pbft算法架构的简要解析fabric的共识算法代码全部都在consensus文件夹里&#xff0c;consensus文件夹里主要分为controller&#xff0c;executor&#xff0c;helper&#xff0c;noops&#xff0c;pbft&#xff0c;util文件模块。 其中consensus.go 主要包含…...

用钢铁侠做网站/t和p在一起怎么做网站

现象&#xff1a;Apache在Windows启动后自动启动服务时出错&#xff0c;跳出错误报告&#xff0c;提示php5ts.dll导致Apache崩溃&#xff0c;同时&#xff0c;所有基于MySQL的PHP程序无法运行&#xff0c;例如phpMyAdmin一登录就出错原因&#xff1a;PATH环境变量设置中将MySQL…...

网站制作多少钱新闻/seo就是搜索引擎广告

事务的四大特征 1.原子性&#xff1a;一个事务中所有对数据库的操作是一个不可分割的操作序列&#xff0c;要么全做要么全不做 2.一致性&#xff1a;数据不会因为事务的执行而遭到破坏 3.隔离性&#xff1a;一个事物的执行&#xff0c;不受其他事务的干扰&#xff0c;即并发执行…...