CS 3723
  Programming Languages  
  Time and Date   
Class Inheritance

Date Example
Python Python and Output
# date1.py: class for dates

mon = [None,"Jan","Feb","Mar","Apr",
            "May","Jun","Jul","Aug",
            "Sep","Oct","Nov","Dec"]
days = [0, 31, 28, 31, 30, 31, 30,
           31, 31, 30, 31, 30, 31]
def check_date(y, m, d):
    if m < 1 or m > 12 or d < 0 or d > 31 or y < 0:
        return False
    elif d > 0 and d <= days[m]:
        return True
    elif m == 2 and d == 29 and is_leap(y):
        return True
    else:
        return false
    ### end of: check_date

def is_leap(y):
    if y%400 == 0 or (y%4 == 0 and y%100 != 0):
        return True
    else:
        return False
    ### end of: is_leap

class Date:
    def __init__(self, y, m, d):
        self.year = y
        self.month = m
        self.day = d
        ### end of: __init__

    def __str__(self):
        return mon[self.month] + \
          " " + str(self.day) + \
          ", " + str(self.year)
        ### end of: __str__

    def incr_day(self):
        self.day +=1
        if not (self.month == 2 and  \
              is_leap(self.year) and \
              self.day == 29) and    \
              self.day > days[self.month]:
            self.day = 1
            self.incr_month()
        ### end of: incr_day

    def incr_month(self):
        self.month +=1
        if self.month > 12:
            self.month = 1
            self.incr_year()
        ### end of: incr_month

    def incr_year(self):
        self.year += 1
        ### end of: incr_year
    ### end of: date1 class

def test_date(y, m, d):
    date = Date(y, m, d)
    print "Start Date: ", date, " "
    date.incr_day()
    print " Next day:  ", date  , " "
    date.incr_day()
    print " Next day:  ", date  , " "
    date.incr_day()
    print " Next day:  ", date,  "\n"
print "TEST ORDINARY DATES"
test_date(2004, 4, 22)
test_date(2013, 3, 30)
test_date(2013, 4, 29)
print "\nTEST YEAR END"
test_date(2001, 12, 30)
test_date(1999, 12, 30)
print "\nTEST LEAP YEARS"
test_date(2004, 2, 28)
test_date(2001, 2, 27)
test_date(2000, 2, 28)
test_date(1900, 2, 27)
test_date(2100, 2, 27)

% python date1.py TEST ORDINARY DATES Start Date: Apr 22, 2004 Next day: Apr 23, 2004 Next day: Apr 24, 2004 Next day: Apr 25, 2004 Start Date: Mar 30, 2013 Next day: Mar 31, 2013 Next day: Apr 1, 2013 Next day: Apr 2, 2013 Start Date: Apr 29, 2013 Next day: Apr 30, 2013 Next day: May 1, 2013 Next day: May 2, 2013 TEST YEAR END Start Date: Dec 30, 2001 Next day: Dec 31, 2001 Next day: Jan 1, 2002 Next day: Jan 2, 2002 Start Date: Dec 30, 1999 Next day: Dec 31, 1999 Next day: Jan 1, 2000 Next day: Jan 2, 2000 TEST LEAP YEARS Start Date: Feb 28, 2004 Next day: Feb 29, 2004 Next day: Mar 1, 2004 Next day: Mar 2, 2004 Start Date: Feb 27, 2001 Next day: Feb 28, 2001 Next day: Mar 1, 2001 Next day: Mar 2, 2001 Start Date: Feb 28, 2000 Next day: Feb 29, 2000 Next day: Mar 1, 2000 Next day: Mar 2, 2000 Start Date: Feb 27, 1900 Next day: Feb 28, 1900 Next day: Mar 1, 1900 Next day: Mar 2, 1900 Start Date: Feb 27, 2100 Next day: Feb 28, 2100 Next day: Mar 1, 2100 Next day: Mar 2, 2100

Time Example
Python Python and Output
# time1.py: class for times

def fill0(x):
    if x < 0 or x > 59:
        return ""
    if x == 0:
        return "00"
    elif x < 10:
        return "0" + str(x)
    else:
        return str(x)
    *** end of: fill0

class Time:
    def __init__(self, h, m, s):
        self.hour = h
        self.min = m
        self.sec = s
        ### end of: __init__

    def __str__(self):
        return fill0(self.hour) + ":" + \
          fill0(self.min) + ":" +  \
          fill0(self.sec)
        ### end of: __str__

    def incr_sec(self):
        self.sec +=1
        if self.sec == 60:
            self.sec = 0
            self.incr_min()
        ### end of: incr_sec

    def incr_min(self):
        self.min +=1
        if self.min == 60:
            self.min = 0
            self.incr_hour()
        ### end of: incr_min

    def incr_hour(self):
        self.hour += 1
        if self.hour == 24:
            self.hour = 0
        ### end of: incr_hour
    ### end of: date1 class
def test_time(y, m, d):
    time = Time(y, m, d)
    print "Start Time: ", time, " "
    time.incr_sec()
    print " Next sec:  ", time  , " "
    time.incr_sec()
    print " Next sec:  ", time  , " "
    time.incr_sec()
    print " Next sec:  ", time,  "\n"

print "TEST TIMES"
test_time(4, 31, 26)
test_time(12, 4, 58)
test_time(23, 59, 58)

% python time1.py TEST TIMES Start Time: 04:31:26 Next sec: 04:31:27 Next sec: 04:31:28 Next sec: 04:31:29 Start Time: 12:04:58 Next sec: 12:04:59 Next sec: 12:05:00 Next sec: 12:05:01 Start Time: 23:59:58 Next sec: 23:59:59 Next sec: 00:00:00 Next sec: 00:00:01

Date / Time Inheritance Example
Python Date class Python Time class Output
# timedate1.py: class for date and time

# date1.py: Date class in Python
mon = [None,"Jan","Feb","Mar","Apr",
            "May","Jun","Jul","Aug",
            "Sep","Oct","Nov","Dec"]
days = [0, 31, 28, 31, 30, 31, 30,
           31, 31, 30, 31, 30, 31]
def check_date(y, m, d):
    if m < 1 or m > 12 or d < 0 or \
      d > 31 or y < 0:
        return False
    elif d > 0 and d <= days[m]:
        return True
    elif m == 2 and d == 29 and \
      is_leap(y):
        return True
    else:
        return false
    ### end of: check_date

def is_leap(y):
    if y%400 == 0 or (y%4 == 0 and \
      y%100 != 0):
        return True
    else:
        return False
    ### end of: is_leap

class Date(object):  # need "object"
    def __init__(self, y, m, d):
        self.year = y
        self.month = m
        self.day = d
        ### end of: __init__

    def __str__(self):
        return mon[self.month] + \
          " " + str(self.day) + \
          ", " + str(self.year)
        ### end of: __str__

    def incr_day(self):
        self.day +=1
        if not (self.month == 2 and  \
              is_leap(self.year) and \
              self.day == 29) and    \
              self.day>days[self.month]:
            self.day = 1
            self.incr_month()
        ### end of: incr_day

    def incr_month(self):
        self.month +=1
        if self.month > 12:
            self.month = 1
            self.incr_year()
        ### end of: incr_day

    def incr_year(self):
        self.year += 1
        ### end of: incr_day
    ### end of: date1 class
# Time class in Python
def fill0(x):
    if x < 0 or x > 59:
        return ""
    if x == 0:
        return "00"
    elif x < 10:
        return "0" + str(x)
    else:
        return str(x)
    ### end of: fill0

class Time(Date): # inherits from Date
    def __init__(self, y, m, d, h, n, s):
        # init from Time
        super(Time,self).__init__(y,m,d)
        self.hour = h
        self.min = n # note: n, not m
        self.sec = s
        ### end of: __init__

    def __str__(self):
        r = super(Time, self).__str__()
        return r + " " + \
          fill0(self.hour) + ":" + \
          fill0(self.min) + ":" +  \
          fill0(self.sec)
        ### end of: __str__

    def incr_sec(self):
        self.sec +=1
        if self.sec == 60:
            self.sec = 0
            self.incr_min()
        ### end of: incr_xec

    def incr_min(self):
        self.min +=1
        if self.min == 60:
            self.min = 0
            self.incr_hour()
        ### end of: incr_sec

    def incr_hour(self):
        self.hour += 1
        if self.hour == 24:
            self.hour = 0
            self.incr_day() # inherited!
            # super(Time,self).incr_day()
        ### end of: incr_hour
    ### end of: Time class

def test_timedate(y, m, d, h, n, s):
    timedate = Time(y, m, d, h, n, s)
    print "\nStart:", timedate
    for dum in range(0,3):
        timedate.incr_sec()
        print " Next:", timedate
    ### end of: test_timedate

print "TEST TIME/DATE"
test_timedate(2004, 4, 22, 4, 31, 26)
test_timedate(2004, 4, 22, 23, 59, 58)
test_timedate(2004, 4, 30, 23, 59, 58)
test_timedate(2004,12, 31, 23, 59, 58)
test_timedate(2001, 12, 31, 23, 59, 58)
test_timedate(1999, 12, 31, 23, 59, 58)
test_timedate(2004, 2, 28, 23, 59, 58)
test_timedate(2001, 2, 27, 23, 59, 58)
test_timedate(2000, 2, 28, 23, 59, 58)
test_timedate(1900, 2, 27, 23, 59, 58)
test_timedate(2100, 2, 27, 23, 59, 58)
% python timedate.py
TEST TIME/DATE

Start: Apr 22, 2004 04:31:26
 Next: Apr 22, 2004 04:31:27
 Next: Apr 22, 2004 04:31:28
 Next: Apr 22, 2004 04:31:29

Start: Apr 22, 2004 23:59:58
 Next: Apr 22, 2004 23:59:59
 Next: Apr 23, 2004 00:00:00
 Next: Apr 23, 2004 00:00:01

Start: Apr 30, 2004 23:59:58
 Next: Apr 30, 2004 23:59:59
 Next: May 1, 2004 00:00:00
 Next: May 1, 2004 00:00:01

Start: Dec 31, 2004 23:59:58
 Next: Dec 31, 2004 23:59:59
 Next: Jan 1, 2005 00:00:00
 Next: Jan 1, 2005 00:00:01

Start: Dec 31, 2001 23:59:58
 Next: Dec 31, 2001 23:59:59
 Next: Jan 1, 2002 00:00:00
 Next: Jan 1, 2002 00:00:01

Start: Dec 31, 1999 23:59:58
 Next: Dec 31, 1999 23:59:59
 Next: Jan 1, 2000 00:00:00
 Next: Jan 1, 2000 00:00:01

Start: Feb 28, 2004 23:59:58
 Next: Feb 28, 2004 23:59:59
 Next: Feb 29, 2004 00:00:00
 Next: Feb 29, 2004 00:00:01

Start: Feb 27, 2001 23:59:58
 Next: Feb 27, 2001 23:59:59
 Next: Feb 28, 2001 00:00:00
 Next: Feb 28, 2001 00:00:01

Start: Feb 28, 2000 23:59:58
 Next: Feb 28, 2000 23:59:59
 Next: Feb 29, 2000 00:00:00
 Next: Feb 29, 2000 00:00:01

Start: Feb 27, 1900 23:59:58
 Next: Feb 27, 1900 23:59:59
 Next: Feb 28, 1900 00:00:00
 Next: Feb 28, 1900 00:00:01

Start: Feb 27, 2100 23:59:58
 Next: Feb 27, 2100 23:59:59
 Next: Feb 28, 2100 00:00:00
 Next: Feb 28, 2100 00:00:01

Notice above that you can write either self.incr_day(), or Super(Time,self).incr_day().

(Revision date: 2014-12-15. Please use ISO 8601, the International Standard.)