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

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 True
    else:
        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 31
    elif month == 4 or month == 6 or month == 9 or month == 11:
        return 30
    else:
        if isLeapYear(year):
            return 29
        else:
            return 28

while True:
    yearStr = input("请输入年份(数字|年份大于 1900)输入 q 退出:")
    if yearStr == "q":
        print("你已退出,欢迎下次再来")
        break
    elif yearStr.isdigit():
        year = int(yearStr)
        monthStr = input("请输入月份(1-12):")
        if monthStr.isdigit() and 1 <= int(monthStr) <= 12:
            month = int(monthStr)
            # 计算该年月距离 1900-01-01 的总天数
            totalDays = 0
            for y in range(1900, year):
                if isLeapYear(y):
                    totalDays += 366
                else:
                    totalDays += 365
            # 将剩余月份的天数相加
            for m in range(1, month):
                totalDays += getDayOfMonth(year, m)

            print(f"{yearStr}年{monthStr}距离 1900-01-01 相差{totalDays}天")
            # 该年该月的第一天是星期几
            firstDayOfMonth = (totalDays + 1) % 7
            match 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 = firstDayOfMonth
            print("\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 的日期处理有更深入的了解,并能够在实际的项目中应用这些知识。


http://www.kler.cn/a/369076.html

相关文章:

  • Java实现邮箱发送邮件添加定时任务(二)
  • 【TIMM库】是一个专门为PyTorch用户设计的图像模型库 python库
  • 网页上的视频怎么下载下来?三种方法
  • 基于SpringBoot的中药材进存销管理系统设计与实现
  • 基于Qt的多线程并行和循序运行实验Demo
  • 软考:常用协议和端口号
  • Qt 窗口可见性 之 close函数和hide函数
  • [Go实战]:HTTP请求转发
  • 电商平台店铺运营:巧用 API 接口的策略之道
  • jemalloc替换标准库 malloc等函数的三种方式
  • 宿舍管理新篇章:基于Spring Boot的系统开发
  • 验证俩套加密算法是否互通
  • [思考记录]做事别忘最初目的
  • 安全见闻(7)-上(网络安全热门证书介绍及备考指南)
  • 理解OAuth2与用户账户与授权UAA的关系
  • thinkadmin,点击列表导出excel
  • [NOIP2015 普及组] 求和
  • Go语言基础教程:函数
  • H5的Canvas绘图——使用fabricjs绘制一个可多选的随机9宫格
  • 微信小程序 - 深 / 浅拷贝实现方法,微信小程序深拷贝与浅拷贝,函数方法封装直接调用使用,深拷贝cloneDeep和浅拷贝clone(深复制和浅复制)
  • C++ TensorRT yolov8
  • C++和Java该如何进行选择?
  • dmsql日志分析工具部署与使用DM8/DM7
  • 2024年9月 GESP CCF C++五级编程能力等级考试认证真题
  • 一个简单的 uas_send_bye.xml for SIPp
  • 2025秋招八股文--Redis篇