使用Python计算年内某日期n天后的日期

  • Post author:
  • Post category:python


任务要求:
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 版权协议,转载请附上原文出处链接和本声明。