文章目录
Python日期时间函数。所有日期、时间的api都在datetime模块内。但是我们有时想用Python学习一下面向对象于是:
设计一个日期类,能够实现与日期有关的有关操作,如计算两个日期之间的间隔,指定日期之后若干天所对应的日期,比较两个日期的大小等。可自行拓展其他功能。
拓展功能:
①判断该日期是一年中的第几天。
②按照YMD(year-month-day)、MDY、DMY和default格式打印日期。
③利用吉姆拉尔森公式计算指定日期所对应是星期几。
④计算两个日期的间隔。
⑤给出指定日期后多少天是那一天。
⑥初始化类的时候检查是否合法。
说明文档(设计思路):
①类设计私有变量normal_year和leap_year,在初始化类的时候将检查日期是否合法。如果不合法将返回错误。
②比较两个日期大小时即compare函数,我摒弃了传统的日期比较方法,直接将日期转化为int类型,比较两个数字大小。
③计算日期间隔(cal_interval)和增加天数(add_days)函数采用传统的日期操作方法。
④在计算日期是星期几的时候采用了基姆拉尔森算法。
⑤在检查类是否正确时对闰年和非法变量等情况均综合考虑。
⑥按照YMD(year-month-day)、MDY、DMY和default格式打印日期。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 |
class Date: def __init__(self, year, month, day): self.__normal_year = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] self.__leap_year = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] self.not_leap = 1 if self.check(year, month, day): self.__year = year self.__month = month self.__day = day else: print('日期输入错误!!!') def check(self, year, month, day): if year < 0: return False if month > 12: return False if year % 4 == 0 and year % 100 != 0 or year % 400 == 0: self.not_leap = 0 if day > self.__leap_year[month - 1]: return False else: if day > self.__normal_year[month - 1]: return False return True def get_year(self): return self.__year def set_year(self, year): self.__year = year def get_month(self): return self.__month def set_month(self, month): self.__month = month def get_day(self): return self.__day def set_day(self, day): self.__day = day def compare(self, temp): cur_date = int(str(self.__year) + str(self.__month) + str(self.__day)) temp_date = int(str(temp.get_year()) + str(temp.get_month()) + str(temp.get_day())) if cur_date > temp_date: return 1 elif cur_date == temp_date: return 0 else: return -1 def cal_interval(self, date): interval = 0 myself = self if self.compare(date) == 0: pass if self.compare(date) < 0: date, myself = myself, date while myself.compare(date) != 0: date.add_days(1) interval += 1 return interval + 1 def add_days(self, plus_day): while plus_day != 0: if self.not_leap == 0: temp = self.__leap_year else: temp = self.__normal_year if temp[self.get_month()-1] >= self.get_day() + plus_day: self.__day = self.get_day() + plus_day plus_day = 0 else: total = 0 for i in range(self.__month, 12): total += temp[i] plus_day -= temp[self.__month-1] - self.__day if total >= plus_day: temp_month = self.__month+1 while plus_day != 0: if plus_day <= temp[temp_month-1]: self.__day = plus_day plus_day = 0 else: plus_day -= temp[temp_month-1] temp_month += 1 self.__month += 1 else: plus_day -= total + 1 self.__year += 1 self.__month = 1 self.__day = 1 def printf(self, form): if form == 'MDY': print('日期: %d-%d-%d ' % (self.__month, self.__day, self.__year)) elif form == 'YMD': print('日期: %d-%d-%d ' % (self.__year, self.__month, self.__day)) elif form == 'DMY': print('日期: %d-%d-%d ' % (self.__day, self.__month, self.__year)) else: print('日期: %d-%d-%d ' % (self.__year, self.__month, self.__day)) def get_day_in_the_year(self): sum_ = 0 if self.not_leap: temp = self.__normal_year else: temp = self.__leap_year for i in range(self.__month - 1): sum_ += temp[i] return sum_ + self.__day def get_week(self): week = ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"] # 基姆拉尔森计算公式 if self.__month == 1 or self.__month == 2: temp = int((self.__day + 2 * (self.__month + 12) + 3 * ((self.__month + 12) + 1) / 5 + (self.__year - 1) + (self.__year - 1) / 4 - (self.__year - 1) / 100 + (self.__year - 1) / 400) % 7) print(week[temp]) else: temp = int((self.__day + 2 * self.__month + 3 * (self.__month + 1) / 5 + self.__year + self.__year / 4 - self.__year / 100 + self.__year / 400) % 7) print(week[temp]) day1 = Date(1998, 5, 5) day1.printf("default") day1.get_week() day2 = Date(2017, 12, 16) day2.printf("default") day2.get_week() print(day1.cal_interval(Date(2017, 12, 16))) day3 = Date(2017, 2, 29) print(Date(2017, 12, 31).get_day_in_the_year()) print(Date(2008, 3, 1).get_day_in_the_year()) |