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

这里写图片描述
更多内容访问omegaxyz.com

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

1.编写类MyDate.java 2.该类有如下构造方法 2.1 无参数构造方法public MyDate(),以当前的系统时间构造MyDate对象 2.2 public MyDate(int year, int month, int day), 以指定的构造MyDate对象 3.该类有如下属性 3.1 private int year ;// 3.2 private int month; // 3.3 private int day; // 4.该类有如下方法 4.1 public String after(int day); //返回当前对象代表的期之后day天的期,比如当前对象是2008-8-8,调用after(5)以后,应该返回2008-8-13,格式可自定义 4.2 public String before(int day); //返回当前对象代表的期之前day天的期,比如当前对象是2008-8-8,调用before(5)以后,应该返回2008-8-3,格式可自定义 4.3 public void setYear(int year); //设置为指定值year 4.4 public void setMonth(int month); //设置为指定值month 4.5 public void setDay(int day); //设置为指定值day 4.6 public int getYear(); //返回当前对象的 4.7 public int getMonth(); //返回当前对象的 4.8 public int getDay(); //返回当前对象的 4.9 public void set (int year, int month, int day); //设置为指定的值year、month、day 4.10 public String toString();//以字符串形式返回当前对象的,例如20080808,格式可自定义 4.11 public boolean equals(MyDate mydate);//当前对象与另一个对象比较,如果两个对象的均相等,则返回true,反之返回false 5.编写TestMyDate.java,在main方法中对MyDate类的各个方法进行测试 6.按照编程规范为MyDate.java编写规范的代码 7.按照java doc API的要求,对代码编写规范的注释,然后利用javadoc.exe命令生成MyDate.java的API doc 8.撰写上机报告
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值