Advertisement
jimkilled

date school

Nov 11th, 2020 (edited)
560
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.56 KB | None | 0 0
  1. class Date():
  2.     def __init__(self, dmy='01.01.1900'):
  3.         day, month, year = map(int, dmy.split('.'))
  4.         y = range(1583, 3001)
  5.         self.year = year if year in y else 1900
  6.         m = range(1, 13)
  7.         self.month = month if month in m else 1
  8.         d = range(1, 32)
  9.         self.day = day if day in d else 1
  10.         self.check_valid_date()
  11.  
  12.     def check_valid_date(self):
  13.         if self.month == 2 and self.day > 29:
  14.             if leap(self.year):
  15.                 self.day = 29
  16.             else:
  17.                 self.day = 28
  18.  
  19.  
  20. def str_date(date):
  21.     '''
  22.    Возвращает дату в виде строки в формате dd.mm.yyyy
  23.    args - date (date)  (class Date)
  24.    return - (str)
  25.    '''
  26.     day = str(date.day)
  27.     month = str(date.month)
  28.     year = str(date.year)
  29.     if len(day) == 1: day = '0' + day
  30.     if len(month) == 1: month = '0' + month
  31.     return day + '.' + month + '.' + year
  32.  
  33.  
  34. def leap(year):
  35.     '''
  36.    Проверка на високосный гол
  37.    args - year (int)
  38.    return - True/False
  39.    '''
  40.     leap = ((year % 400 == 0) or (year % 100 != 0)) and (year % 4 == 0)
  41.     return leap
  42.  
  43.  
  44. def day_m(year, month):
  45.     '''
  46.    Кол-во дней в месяце
  47.    args - year, month (int)
  48.    return - count_days (int)
  49.    '''
  50.     if month in (4, 6, 9, 11): days = 30
  51.     elif month in (1, 3, 5, 7, 8, 10, 12): days = 31
  52.     else:
  53.         days = 28
  54.         if leap(year):
  55.             days += 1
  56.     return days
  57.  
  58.  
  59. def day_y(year):
  60.     '''
  61.    args - year (int)
  62.    return - days (int)
  63.    '''
  64.     if leap(year): return 366
  65.     else: return 365
  66.  
  67.  
  68. def tomorrow(date):
  69.     '''
  70.    Дата на следующий
  71.    args - date (Date)
  72.    return tmrw_date (Date)
  73.    '''
  74.     tmrw_date = date
  75.     if date.day != day_m(date.year, date.month):
  76.         tmrw_date.day += 1
  77.     elif date.month != 12:
  78.         tmrw_date.month += 1
  79.         tmrw_date.day = 1
  80.     else:
  81.         tmrw_date.year += 1
  82.         tmrw_date.month = 1
  83.         tmrw_date.day = 1
  84.     return tmrw_date
  85.  
  86.  
  87. def yesterday(date):
  88.     '''
  89.    Находит дату вчерашнего дня
  90.    args - date (Date)
  91.    return - ystr_date (Date)
  92.    '''
  93.     ystr_date = date
  94.     if date.day != 1:
  95.         ystr_date.day -= 1
  96.     elif date.day == 1:
  97.         if date.month != 1:
  98.             ystr_date.month = date.month - 1
  99.             ystr_date.day = day_m(ystr_date.year, ystr_date.month)
  100.         else:
  101.             ystr_date.year = date.year - 1
  102.             ystr_date.month = 12
  103.             ystr_date.day = day_m(ystr_date.year, ystr_date.month)
  104.     return ystr_date
  105.  
  106.  
  107. def future(days, date):
  108.     '''
  109.    Прибавляет к начальной дате кол-во дней (days),
  110.    возвращает новую дату
  111.    args - days (int), date (Date)
  112.    return - date (Date)
  113.    '''
  114.     for i in range(1, date.month):
  115.         days += day_m(date.year, i)
  116.     days += date.day
  117.     while days > day_y(date.year):
  118.         days -= day_y(date.year)
  119.         date.year += 1
  120.     date.month = 1
  121.     while days > day_m(date.year, date.month):
  122.         days -= day_m(date.year, date.month)
  123.         date.month += 1
  124.     date.day = days
  125.     return date
  126.  
  127.  
  128. def past(days, date):
  129.     '''
  130.    Находить дату которая была days дней назад
  131.    args - days (int), date (Date)
  132.    return - date (Date)
  133.    '''
  134.     while days >= day_y(date.year):
  135.         days -= day_y(date.year)
  136.         date.year -= 1
  137.     while days >= day_m(date.year, date.month):
  138.         days -= day_m(date.year, date.month)
  139.         date.month -= 1
  140.     while days > date.day:
  141.         date.month -= 1
  142.         days -= date.day
  143.         date.day = day_m(date.year, date.month)
  144.     date.day -= days
  145.     return date
  146.  
  147.  
  148. def latest_date(date1, date2):
  149.     '''
  150.    Находит позднюю дату из двух
  151.    args - date1 (Date), date2 (Date)
  152.    return - latest_date (Date) or 0 (int)
  153.    '''
  154.     if date1.year > date2.year:
  155.         latest_date = date1
  156.     elif date1.year < date2.year:
  157.         latest_date = date2
  158.     else:
  159.         if date1.month > date2.month:
  160.             latest_date = date1
  161.         elif date1.month < date2.month:
  162.             latest_date = date2
  163.         else:
  164.             if date1.day > date2.day:
  165.                 latest_date = date1
  166.             elif date1.day > date2.day:
  167.                 latest_date = date2
  168.             else:
  169.                 latest_date = 0
  170.     return latest_date
  171.  
  172.  
  173. def days_d1_d2(date1, date2):
  174.     '''
  175.    Находит промежуток между двумя
  176.    args - date1 (Date), date2(Date)
  177.    return - days (int)
  178.    '''
  179.     days = 0
  180.     latest = latest_date(date1, date2)
  181.     if latest == 0:
  182.         return 0
  183.     else:
  184.         if date1 == latest:
  185.             early = Date(str_date(date2))
  186.         else:
  187.             early = Date(str_date(date1))
  188.  
  189.         days += latest.day
  190.         while latest.month > 1:
  191.             latest.month -= 1
  192.             days += day_m(latest.year, latest.month)
  193.         while latest.year > early.year:
  194.             latest.year -= 1
  195.             days += day_y(latest.year)
  196.  
  197.         days -= early.day
  198.         while early.month > 1:
  199.             early.month -= 1
  200.             days -= day_m(early.year, early.month)
  201.     return days
  202.  
  203.  
  204. def input_date():
  205.     y, m, d = input().split()
  206.     s = d + '.' + m + '.' + y
  207.     return Date(s)
  208.  
  209.  
  210. def main():
  211.     date = input_date()
  212.     print(str_date(date))
  213.     date2 = input_date()
  214.     print(str_date(date2))
  215.     print(days_d1_d2(date, date2))
  216.  
  217. main()
  218.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement