def _make_result(cls, values, now, timezone):
        """
        Makes a date or datetime or time object from a map of component values
        :param values: the component values
        :param now: the current now
        :param timezone: the current timezone
        :return: the date, datetime, time or none if values are invalid
        """
        date = None
        time = None

        if Component.MONTH in values:
            year = cls._year_from_2digits(values.get(Component.YEAR, now.year), now.year)
            month = values[Component.MONTH]
            day = values.get(Component.DAY, 1)
            try:
                date = datetime.date(year, month, day)
            except ValueError:
                return None  # not a valid date

        if (Component.HOUR in values and Component.MINUTE in values) or Component.HOUR_AND_MINUTE in values:
            if Component.HOUR_AND_MINUTE in values:
                combined = values[Component.HOUR_AND_MINUTE]
                hour = combined // 100
                minute = combined - (hour * 100)
                second = 0
                nano = 0
            else:
                hour = values[Component.HOUR]
                minute = values[Component.MINUTE]
                second = values.get(Component.SECOND, 0)
                nano = values.get(Component.NANO, 0)

                if hour < 12 and values.get(Component.AM_PM) == cls.PM:
                    hour += 12
                elif hour == 12 and values.get(Component.AM_PM) == cls.AM:
                    hour -= 12

            try:
                time = datetime.time(hour, minute, second, microsecond=nano // 1000)
            except ValueError:
                return None  # not a valid time

        if Component.OFFSET in values:
            timezone = pytz.FixedOffset(values[Component.OFFSET] // 60)

        if date is not None and time is not None:
            return timezone.localize(datetime.datetime.combine(date, time))
        elif date is not None:
            return date
        elif time is not None:
            return time
        else:
            return None