博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python 根据年月日,计算是这一年中的第几天
阅读量:4709 次
发布时间:2019-06-10

本文共 2210 字,大约阅读时间需要 7 分钟。

利用python计算某一天是这一年中的第几天,例如,给定年份= 2019年,月份= 1,日期= 3,则返回3;因为2019-01-03日期是2019年的第3 天。

首先,我们要知道闰年、平年怎么区分:

非整百年:能被4整除的为闰年。(如2004年就是闰年,2001年不是闰年);

整百年:能被400整除的是闰年。(如2000年是闰年,1900年不是闰年)。

对于公元前和数值很大的年份,我们这里不做讨论。下面我们来写一下代码:

我按照功能把代码分成了几部分,首先定义几个会用到的常量:

1 month_of_days31 = [1, 3, 5, 7, 8, 10, 12]2 month_of_days30 = [4, 6, 9, 11]3 feb_month = 2

我们需要判断一下当前年份是不是闰年: 

1 def is_leap_year(year):2     """3     判断当前年份是不是闰年,年份公元后,且不是过大年份4     :param year: 年份5     :return: True 闰年, False 平年6     """7     if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:8         return True9     return False

然后,对年、月、日参数做一下参数校验

1 def validate_param(year, month, day): 2     """ 3     参数校验 4     :param year: 年份 5     :param month: 月份 6     :param day: 日期 7     :return: error_msg 错误信息,没有为空 8     """ 9     error_msg = u''10     if not isinstance(year, int) or year < 1:11         error_msg = u'年份输入不符合要求'12     if not isinstance(month, int) or month < 1 or month > 12:13         error_msg = u'月份输入不符合要求'14     if not isinstance(day, int) or day < 1 \15             or (month in month_of_days31 and day > 31) \16             or (month in month_of_days30 and day > 30) \17             or (month == feb_month and (day > 29 if is_leap_year(year) else day > 28)):18         error_msg = u'日期输入不符合要求'19     return error_msg

最后,对年、月、日进行计算:

1 def get_day_of_year(year, month, day): 2     """ 3     获取一个日期在这一年中的第几天 4     :param year: 年份 5     :param month: 月份 6     :param day: 日期 7     :return: 在这一年中的第几天 8     """ 9     # 参数校验10     error_msg = validate_param(year, month, day)11     if error_msg:12         return error_msg13 14     if month == 1:15         return day16 17     if month == 2:18         return day + 3119 20     days_of_31_num = 021     days_of_30_num = 022     # 31天月份数23     for days_of_31 in month_of_days31:24         if days_of_31 < month:25             days_of_31_num += 126         else:27             break28 29     # 30天月份数30     for days_of_30 in month_of_days30:31         if days_of_30 < month:32             days_of_30_num += 133         else:34             break35 36     return days_of_31_num * 31 + days_of_30_num * 30 + (29 if is_leap_year(year) else 28) + day

 

转载于:https://www.cnblogs.com/iamls/p/10291896.html

你可能感兴趣的文章
产品经理聊产品--mac book pro 2018 初体验
查看>>
可以进行SHA-1,SHA-224,SHA-256,SHA-384,SHA-512五种算法签名的工具类,以及简单说明
查看>>
c#进程间通讯方案之IPC通道
查看>>
CSS3分享按钮动画特效
查看>>
[BT5]信息收集1-1 Dnsenum
查看>>
tf.reduce_mean
查看>>
IDA相关下载
查看>>
[Codeforces] #441 div.2
查看>>
BusHelper
查看>>
数据整合构思
查看>>
pandas所占内存释放
查看>>
MySQL关于TYPE和ENGIN的一点问题
查看>>
工作中的一些问题总结
查看>>
母猪的产后护理——一些零碎的知识
查看>>
你所不知的 CSS ::before 和 ::after 伪元素用法
查看>>
POJ 3666 Making the Grade
查看>>
Codeforces Round #352 (Div. 2) A. Summer Camp 水题
查看>>
Entity Framework 更新数据库 datetime 类型的问题 从 datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值。...
查看>>
Vue.js 基础学习之自定义指令
查看>>
[Hadoop]-HDFS-架构篇
查看>>