1. 程式人生 > >Python日期類的實現

Python日期類的實現

Python日期時間函式。所有日期、時間的api都在datetime模組內。但是我們有時想用Python學習一下面向物件於是:

設計一個日期類,能夠實現與日期有關的有關操作,如計算兩個日期之間的間隔,指定日期之後若干天所對應的日期,比較兩個日期的大小等。可自行拓展其他功能。
更多內容訪問omegaxyz.com

拓展功能:
①判斷該日期是一年中的第幾天。
②按照YMD(year-month-day)、MDY、DMY和default格式列印日期。
③利用吉姆拉爾森公式計算指定日期所對應是星期幾。
④計算兩個日期的間隔。
⑤給出指定日期後多少天是那一天。
⑥初始化類的時候檢查是否合法。

說明文件(設計思路):
①類設計私有變數normal_year和leap_year,在初始化類的時候將檢查日期是否合法。如果不合法將返回錯誤。
②比較兩個日期大小時即compare函式,我摒棄了傳統的日期比較方法,直接將日期轉化為int型別,比較兩個數字大小。
③計算日期間隔(cal_interval)和增加天數(add_days)函式採用傳統的日期操作方法。
④在計算日期是星期幾的時候採用了基姆拉爾森演算法。
⑤在檢查類是否正確時對閏年和非法變數等情況均綜合考慮。
⑥按照YMD(year-month-day)、MDY、DMY和default格式列印日期。

程式碼:

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())

網站文章採用知識共享許可協議BY-NC-SA4.0授權
© 2018 • OmegaXYZ-版權所有 轉載請註明出處