Python日期類的實現
阿新 • • 發佈:2018-12-22
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-版權所有 轉載請註明出處