概述
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 日期计算所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复