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

Python日期类的实现_第1张图片
更多内容访问omegaxyz.com

网站文章采用知识共享许可协议BY-NC-SA4.0授权
© 2018 • OmegaXYZ-版权所有 转载请注明出处

你可能感兴趣的:(python,徐奕的专栏,python基础与应用,Python)