def extractTimes(self, inp):
        def handleMatch(time):
            relative = False
            if not time:
                return None
            elif time.group(1) == 'morning':
                h = 8
                m = 0
            elif time.group(1) == 'afternoon':
                h = 12
                m = 0
            elif time.group(1) == 'evening':
                h = 19
                m = 0
            elif time.group(4) and time.group(5):
                h, m = 0, 0
                converter = NumberService()
                try:
                    diff = converter.parse(time.group(4))
                except:
                    return None
                if time.group(5) == 'hours':
                    h += diff
                else:
                    m += diff
                if time.group(6):
                    converter = NumberService()
                    try:
                        diff = converter.parse(time.group(7))
                    except:
                        return None
                    if time.group(8) == 'hours':
                        h += diff
                    else:
                        m += diff
                relative = True
            else:
                t = time.group(2)
                h, m = int(t.split(':')[0]) % 12, int(t.split(':')[1])
                try:
                    if time.group(3) == 'pm':
                        h += 12
                except IndexError:
                    pass
            if relative:
                return self.now + datetime.timedelta(hours=h, minutes=m)
            else:
                return datetime.datetime(
                    self.now.year, self.now.month, self.now.day, h, m
                )
        inp = self._preprocess(inp)
        return [handleMatch(time) for time in self._timeRegex.finditer(inp)]