任务要求:
1.计算年内日期data n天后的日期
拓展任务:
1.计算某年第n天的值
2.计算年内日期与日期之间的差
# 支持年内运算,不支持跨年运算
class Data:
# 初始化函数 -- 绑定对象
def __init__(self, year, month, day):
self.year = year
self.month = month
self.day = day
print(f"今天是{self.year}年{self.month}月{self.day}日")
self.shortest_month = [2]
self.short_month = [4, 6, 9, 11]
self.long_month = [1, 3, 5, 7, 8, 10, 12]
# 闰年
if self.year % 4 == 0:
self.every_month = [0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
self.every_month_plus = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 365]
print(f"{self.year}是闰年")
# 非闰年
else:
self.every_month = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
self.every_month_plus = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 366]
print(f"{self.year}是非闰年")
# 计算该日期n天后的日期
def plus(self, n):
# 进入一个“死”循环,遇break则终止
while True:
# 设置检查天check_day
check_day = 0
# 如果初始月份长为31天
if self.month in self.long_month:
# 如果初始日期和n相加大于31天
if self.day + n > 31:
m = n
# 如果下一个月份在31天的长月份,当check_day>0则表示check_day有溢出。就进入下一个月的检查
if self.month + 1 in self.long_month:
check_day = n - 31
elif self.month + 1 in self.short_month:
check_day = n - 30
elif self.month + 1 in self.shortest_month:
check_day = n - self.every_month[2]
# 如果下一个月份check_day检查天>0,则溢出,继续循环。
if check_day > 0:
if self.month + 1 in self.long_month:
n = n - 31
elif self.month + 1 in self.short_month:
n = n - 30
elif self.month + 1 in self.shortest_month:
n = n - self.every_month[2]
self.month = self.month + 1
continue
# 否则,终止循环,终止日= 初始日 + m(n的剩余值) - 31(长月份的日数)
else:
self.month = self.month + 1
self.day = self.day + m - 31
break
# 如果相加并没有超过31天,则表明n天后的月份仍为初始月份
else:
self.day = self.day + n
break
# 如果初始月份长为30天
elif self.month in self.short_month:
if self.day + n > 30:
m = n
if self.month + 1 in self.long_month:
check_day = n - 31
elif self.month + 1 in self.short_month:
check_day = n - 30
elif self.month + 1 in self.shortest_month:
check_day = n - self.every_month[2]
if check_day > 0:
if self.month + 1 in self.long_month:
n = n - 31
elif self.month + 1 in self.short_month:
n = n - 30
elif self.month + 1 in self.shortest_month:
n = n - self.every_month[2]
self.month = self.month + 1
continue
else:
self.month = self.month + 1
self.day = self.day + m - 30
break
else:
self.day = self.day + n
break
# 如果初始月份为2月份
elif self.month in self.shortest_month:
if self.day + n > self.every_month[2]:
m = n
if self.month + 1 in self.long_month:
check_day = n - 31
elif self.month + 1 in self.short_month:
check_day = n - 30
elif self.month + 1 in self.shortest_month:
check_day = n - self.every_month[2]
if check_day > 0:
if self.month + 1 in self.long_month:
n = n - 31
elif self.month + 1 in self.short_month:
n = n - 30
elif self.month + 1 in self.shortest_month:
n = n - self.every_month[2]
self.month = self.month + 1
continue
else:
self.month = self.month + 1
self.day = self.day + m - self.every_month[2]
break
else:
self.day = self.day + n
break
print(f"n天后是{self.year}年{self.month}月{self.day}日")
# 计算某年第n天的日期
def num_data(self, n):
i = 0
month = 0
while True:
# 从一月份开始,如果第n天>某月份的日数,则继续
if n > self.every_month[i + 1]:
n = n - self.every_month[i + 1]
month = i + 1
i = i + 1
continue
# 否则终止循环
else:
month = i + 1
break
print(f"第n天是是{self.year}年{month}月{n}日")
# 计算日期与日期之间的差值
def D_value(self, before_month, before_day, after_month, after_day):
check_Dday_value = after_day - before_day
# 如果终止日 - 初始日 < 0,则它们相差月份为after_month - before_month -1
if check_Dday_value < 0:
# 定义总相差月份的天数为:
sum_month = self.every_month_plus[after_month] - self.every_month_plus[before_month + 1]
# 如果初始月为长月份(31天)
if before_month in self.long_month:
# 则天数相差为:
Dday = after_day - 1 + 31 - before_day
sum_day = sum_month + Dday
print(f"相差了{sum_day}天")
elif before_month in self.short_month:
Dday = after_day - 1 + 30 - before_day
sum_day = sum_month + Dday
print(f"相差了{sum_day}天")
elif before_month in self.shortest_month:
Dday = after_day - 1 + self.every_month[2] - before_day
sum_day = sum_month + Dday
print(f"相差了{sum_day}天")
else:
sum_month = self.every_month_plus[after_month] - self.every_month_plus[before_month]
Dday = after_day - before_day
sum_day = sum_month + Dday
print(f"相差了{sum_day}天")
# 非闰年
# 初始化函数
# 定义日期的输出格式是:xxxx年xx月xx日
do_01 = Data(2003, 6, 26)
# 调用类方法
# 1.返回日期d之后n天的日期
do_01.plus(177)
# 2.返回某年第n天的日期
do_01.num_data(177)
# 3.返回日期与日期之间的差
do_01.D_value(6, 26, 8, 30)
# -------------------------------------
# 闰年
# 初始化函数
# 定义日期的输出格式是:xxxx年xx月xx日
do_02 = Data(2004, 6, 26)
# 调用类方法
# 1.返回日期d之后n天的日期
do_02.plus(177)
# 2.返回某年第n天的日期
do_02.num_data(178)
# 3.返回日期与日期之间的差
do_02.D_value(6, 26, 8, 30)
非闰年运行结果:
F:\Anaconda3\python.exe F:\python01\library\practise_01.py
今天是2003年6月26日
2003是非闰年
n天后是2003年12月20日
第n天是是2003年6月26日
相差了66天
闰年运行结果:
F:\Anaconda3\python.exe F:\python01\library\practise_01.py
今天是2004年6月26日
2004是闰年
n天后是2004年12月20日
第n天是是2004年6月26日
相差了66天
版权声明:本文为weixin_64346531原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。