docs: def parse_stupid_date(c):
      """
      kdbが返してくる間抜けな授業時間をパースしてdatetimeを返す
  
      例:
  
          月1
          木3,4
          水3,4金5,6
          月・火・水3-6
  
          sqlite3 ~/.course_list.db 'select periods from courses'|sort|uniq
      """
      start_time = {
          1: { "hour": 8, "minute": 40 },
          2: { "hour": 10, "minute": 10 },
          3: { "hour": 12, "minute": 15 },
          4: { "hour": 13, "minute": 45 },
          5: { "hour": 15, "minute": 15 },
          6: { "hour": 16, "minute": 45 },
      }
  
      end_time = {
          1: { "hour": 9, "minute": 55 },
          2: { "hour": 11, "minute": 25 },
          3: { "hour": 13, "minute": 30 },
          4: { "hour": 15, "minute": 0 },
          5: { "hour": 16, "minute": 30 },
          6: { "hour": 18, "minute": 0 },
      }
  
      periods = c['periods']
      dates = []
      while len(periods) > 0:
          m = re.search('((?:.・)*(?:.))([0-9])([,-])([0-9])', periods)
          assert(m is not None)
  
          groups = list(reversed(list(m.groups())))
          weekdays = groups.pop().split('・')
          period_start = int(groups.pop())
  
          if len(groups) == 0:
              sep = ','
              period_end = period_start
          else:
              sep = groups.pop()
              period_end = int(groups.pop())
  
          assert(sep in ['-', ','])
          assert(1 <= period_start <= 6)
          assert(1 <= period_end <= 6)
  
          if sep == ',':
              assert(period_end - period_start == 1)
  
          for weekday in weekdays:
              dt = get_start_date(c['modules'], weekday)
              dt_start = dt.replace(**start_time[period_start])
              dt_end = dt.replace(**end_time[period_end])
              dates.append((dt_start, dt_end))
  
          periods = periods[m.span()[1]:]
  
      return dates