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-版权所有 转载请注明出处