def assertDateTimesBefore(self, sequence, target, strict=True, msg=None):
        '''Fail if any elements in ``sequence`` are not before
        ``target``.

        If ``target`` is iterable, it must have the same length as
        ``sequence``

        If ``strict=True``, fail unless all elements in ``sequence``
        are strictly less than ``target``. If ``strict=False``, fail
        unless all elements in ``sequence`` are less than or equal to
        ``target``.

        Parameters
        ----------
        sequence : iterable
        target : datetime, date, iterable
        strict : bool
        msg : str
            If not provided, the :mod:`marbles.mixins` or
            :mod:`unittest` standard message will be used.

        Raises
        ------
        TypeError
            If ``sequence`` is not iterable.
        ValueError
            If ``target`` is iterable but does not have the same length
            as ``sequence``.
        TypeError
            If ``target`` is not a datetime or date object and is not
            iterable.
        '''
        if not isinstance(sequence, collections.Iterable):
            raise TypeError('First argument is not iterable')

        if strict:
            standardMsg = '%s is not strictly less than %s' % (sequence,
                                                               target)
            op = operator.lt
        else:
            standardMsg = '%s is not less than %s' % (sequence, target)
            op = operator.le

        # Null date(time)s will always compare False, but
        # we want to know about null date(time)s
        if isinstance(target, collections.Iterable):
            if len(target) != len(sequence):
                raise ValueError(('Length mismatch: '
                                  'first argument contains %s elements, '
                                  'second argument contains %s elements' % (
                                      len(sequence), len(target))))
            if not all(op(i, j) for i, j in zip(sequence, target)):
                self.fail(self._formatMessage(msg, standardMsg))
        elif isinstance(target, (date, datetime)):
            if not all(op(element, target) for element in sequence):
                self.fail(self._formatMessage(msg, standardMsg))
        else:
            raise TypeError(
                'Second argument is not a datetime or date object or iterable')
Fail if any elements in ``sequence`` are not before
        ``target``.

        If ``target`` is iterable, it must have the same length as
        ``sequence``

        If ``strict=True``, fail unless all elements in ``sequence``
        are strictly less than ``target``. If ``strict=False``, fail
        unless all elements in ``sequence`` are less than or equal to
        ``target``.

        Parameters
        ----------
        sequence : iterable
        target : datetime, date, iterable
        strict : bool
        msg : str
            If not provided, the :mod:`marbles.mixins` or
            :mod:`unittest` standard message will be used.

        Raises
        ------
        TypeError
            If ``sequence`` is not iterable.
        ValueError
            If ``target`` is iterable but does not have the same length
            as ``sequence``.
        TypeError
            If ``target`` is not a datetime or date object and is not
            iterable.