def METHOD_NAME(item_value, op, user_value):
    """Compare any combination of Timestamp and Timedelta objects"""
    # Some filters don't make any sense
    if (item_value in Timestamp.CONSTANTS and
        isinstance(user_value, Timedelta) and
        op in _lgfilters):
        return False
    elif item_value in Timedelta.CONSTANTS and op in _lgfilters:
        return False
    type_item_value = type(item_value)
    type_user_value = type(user_value)
    if type_user_value is Timestamp:
        if type_item_value is Timestamp:
            # result = op(item_value, user_value)
            # log.debug('1: %r %s %r = %r', item_value, op.__name__, user_value, result)
            # return result
            return op(item_value, user_value)
        elif type_item_value is Timedelta:
            # result = op(item_value, user_value.timedelta)
            # log.debug('2: %r %s %r (%r) = %r',
            #           item_value, op.__name__, user_value, user_value.timedelta, result)
            # return result
            return op(item_value, user_value.timedelta)
    elif type_user_value is Timedelta:
        # If the filter is, e.g., 'less than 1y ago', future dates would match
        # (because "[any future date] > -[seconds in 1y]") but we interpret the
        # filter as 'less than 1y ago up till now'.  Same thing for 'in less
        # than 1y' - past dates technically match, but they shouldn't.
        if not _either_past_or_future(item_value, user_value):
            return False
        elif type_item_value is Timedelta:
            # result = op(abs(item_value), abs(user_value))
            # log.debug('3: %r %s %r = %r', item_value, op.__name__, user_value, result)
            # return result
            return op(abs(item_value), abs(user_value))
        elif type_item_value is Timestamp:
            user_value_timestamp = user_value.timestamp
            if user_value < 0:
                if item_value in (Timestamp.NOW, Timestamp.SOON):
                    return False
                # result = op(user_value_timestamp, item_value)
                # log.debug('4: %r (%r) %s %r = %r',
                #           user_value, user_value_timestamp, op.__name__, item_value, result)
                # return result
                return op(user_value_timestamp, item_value)
            else:
                # result = op(item_value, user_value_timestamp)
                # log.debug('5: %r %s %r (%r) = %r',
                #           item_value, op.__name__, user_value, user_value_timestamp, result)
                # return result
                return op(item_value, user_value_timestamp)
    raise RuntimeError('cannot compare %r with %r' % (item_value, user_value))