我是靠谱客的博主 斯文白羊,最近开发中收集的这篇文章主要介绍python 日期计算python 日期计算,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

python 日期计算

灵感

今日偶然看到了蓝桥杯的2015年的一道题,虽然不难,但是这个有一丢丢恶心。因为我当时教课的时候是规定他们不可以用python的库做这道题的。

题目链接

所以在计算日期的时候,如何不利用time、datetime、pandas等其他的python模块呢?

 

喜闻乐见的循环input

listSetDay = []
listSetTime = []
a = " "
while a!= "":
a = input().split(" ")
if a[0] == "":
break
a = list(map(lambda b : int(b), a))

我这里面设置的是回车就会结束循环,毕竟不可以用time或者multiprocessing。。。。所以导致每次输入之后,必须回车才会开始程序。

这里的主要想法就是把输入进来的变量分别存进2个list,一个放日期,一个放增加的日子。

listSetDay.append(a[0])
listSetDay.append(a[1])
listSetDay.append(a[2])
listSetTime.append(a[3])

就是append,很简单

日期判断

主要就是分为4类,31天、30天、29天、28天。对应了1、3、5、7、8、10、12;4、6、9、11;2(闰年);2(平年)。

这里要注意,闰年指能被4整除的年份,且在被100整除的同时被400整除。剩余的都是平年。

if listSetDay[i*3+2] >= 367 and ((listSetDay[i*3]%4 == 0 and listSetDay[i*3]%100 != 0) or listSetDay[i*3]%400 == 0):
listSetDay[i*3+2] -= 366
listSetDay[i*3] += 1
elif listSetDay[i*3+2] >= 366:
listSetDay[i*3+2] -= 365
listSetDay[i*3] += 1
if listSetDay[i*3+1] == 1 or listSetDay[i*3+1] == 3 or listSetDay[i*3+1] == 5 or listSetDay[i*3+1] == 7 or listSetDay[i*3+1] == 8 or listSetDay[i*3+1] == 10 or listSetDay[i*3+1] == 12:
if listSetDay[i*3+2] <= 31:
break
listSetDay[i*3+2] -= 31
listSetDay[i*3+1] += 1
elif listSetDay[i*3+1] == 4 or listSetDay[i*3+1] == 6 or listSetDay[i*3+1] == 9 or listSetDay[i*3+1] == 11:
if listSetDay[i*3+2] <= 30:
break
listSetDay[i*3+2] -= 30
listSetDay[i*3+1] += 1
elif listSetDay[i*3+1] == 2 and ((listSetDay[i*3]%4 == 0 and listSetDay[i*3]%100 != 0) or listSetDay[i*3]%400 == 0):
if listSetDay[i*3+2] <= 29:
break
listSetDay[i*3+2] -= 29
listSetDay[i*3+1] += 1
else:
if listSetDay[i*3+2] <= 28:
break
listSetDay[i*3+2] -= 28
listSetDay[i*3+1] += 1
if listSetDay[i*3+1] == 13:
listSetDay[i*3+1] = 1
listSetDay[i*3] += 1

就是一堆if,不过要注意就是31、30、29、28这几个类型必须得是if和elif的关系,不然月份增加后会多判断一次(虽然可能不会有问题,但是还是要避免自己造bug)。

同时我为了减少运算次数,在前面加了一个年份判断,就是超过366天或者367天,就不进行底下的,先增加年份。(这样更快)

整体代码

listSetDay = []
listSetTime = []
a = " "
while a!= "":
a = input().split(" ")
if a[0] == "":
break
a = list(map(lambda b : int(b), a))
listSetDay.append(a[0])
listSetDay.append(a[1])
listSetDay.append(a[2])
listSetTime.append(a[3])
for i in range(len(listSetTime)):
listSetDay[i*3+2] += listSetTime[i]
while True:
if listSetDay[i*3+2] >= 367 and ((listSetDay[i*3]%4 == 0 and listSetDay[i*3]%100 != 0) or listSetDay[i*3]%400 == 0):
listSetDay[i*3+2] -= 366
listSetDay[i*3] += 1
elif listSetDay[i*3+2] >= 366:
listSetDay[i*3+2] -= 365
listSetDay[i*3] += 1
if listSetDay[i*3+1] == 1 or listSetDay[i*3+1] == 3 or listSetDay[i*3+1] == 5 or listSetDay[i*3+1] == 7 or listSetDay[i*3+1] == 8 or listSetDay[i*3+1] == 10 or listSetDay[i*3+1] == 12:
if listSetDay[i*3+2] <= 31:
break
listSetDay[i*3+2] -= 31
listSetDay[i*3+1] += 1
elif listSetDay[i*3+1] == 4 or listSetDay[i*3+1] == 6 or listSetDay[i*3+1] == 9 or listSetDay[i*3+1] == 11:
if listSetDay[i*3+2] <= 30:
break
listSetDay[i*3+2] -= 30
listSetDay[i*3+1] += 1
elif listSetDay[i*3+1] == 2 and ((listSetDay[i*3]%4 == 0 and listSetDay[i*3]%100 != 0) or listSetDay[i*3]%400 == 0):
if listSetDay[i*3+2] <= 29:
break
listSetDay[i*3+2] -= 29
listSetDay[i*3+1] += 1
else:
if listSetDay[i*3+2] <= 28:
break
listSetDay[i*3+2] -= 28
listSetDay[i*3+1] += 1
if listSetDay[i*3+1] == 13:
listSetDay[i*3+1] = 1
listSetDay[i*3] += 1
for i in range(len(listSetTime)):
print(listSetDay[i*3],"-",listSetDay[i*3+1],"-",listSetDay[i*3+2])

最后

以上就是斯文白羊为你收集整理的python 日期计算python 日期计算的全部内容,希望文章能够帮你解决python 日期计算python 日期计算所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部