def _are_bounds_contained_by_dataset(dataset, bounds):
    """Check if a Dataset fully contains a bounds.

    :param bounds: The Bounds object to check.
    :type bounds: Bounds
    :param dataset: The Dataset that should be fully contain the
        Bounds
    :type dataset: Dataset

    :returns: True if the Bounds are contained by the Dataset, Raises
        a ValueError otherwise
    """
    lat_min, lat_max, lon_min, lon_max = dataset.spatial_boundaries()
    start, end = dataset.temporal_boundaries()
    errors = []
    if lat_min > bounds.lat_max:
        error = (
            'bounds.lat_max: %s is not between lat_min: %s and lat_max: %s' %
            (bounds.lat_max, lat_min, lat_max))
        errors.append(error)
    if lon_min > bounds.lon_max:
        error = (
            'bounds.lon_max: %s is not between lon_min: %s and lon_max: %s' %
            (bounds.lon_max, lon_min, lon_max))
        errors.append(error)
    if not bounds.start is None:
        if not start <= bounds.start <= end:
            error = 'bounds.start: %s is not between start: %s and end: %s' % (
                bounds.start, start, end)
            errors.append(error)
    if not bounds.end is None:
        if not start <= bounds.end <= end:
            error = 'bounds.end: %s is not between start: %s and end: %s' % (
                bounds.end, start, end)
            errors.append(error)
    if len(errors) == 0:
        return True
    else:
        error_message = '\n'.join(errors)
        raise ValueError(error_message)
