def date_to_iso8601(date):
    """
        Returns a USO8601 formatted string from a Date.
        :param date: Date to format
        :return:     Formatted Date
    """
    dateTimeStr = date.strftime('%Y-%m-%dT%H:%M:%S')
    timeZone_Sign = date.strftime('%z')[0:1]
    timeZone_Str = '%s:%s' % (
        date.strftime('%z')[1:3], date.strftime('%z')[3:5]
    )
    return '{dateTimeStr}{tzsign}{timezone}'.format(
        dateTimeStr=dateTimeStr,
        tzsign=timeZone_Sign,
        timezone=timeZone_Str
    ).replace(':', '%3A').replace('+', '%2B')