def parse(value, preserve_original_tz=False, validate_value=True):
    """
    Parse date in the ISO8601 format and return a time-zone aware datetime object.

    :param value: Date in ISO8601 format.
    :type value: ``str``

    :param preserve_original_tz: True to preserve the original timezone - by default result is
                                 converted into UTC.
    :type preserve_original_tz: ``boolean``

    :param validate_value: True to validate that the date is in the ISO8601 format.
    :type validate_value: ``boolean``

    :rtype: ``datetime.datetime``
    """
    if validate_value:
        validate(value, raise_exception=True)

    dt = date_utils.parse(value=value, preserve_original_tz=preserve_original_tz)
    return dt

    Parse date in the ISO8601 format and return a time-zone aware datetime object.

    :param value: Date in ISO8601 format.
    :type value: ``str``

    :param preserve_original_tz: True to preserve the original timezone - by default result is
                                 converted into UTC.
    :type preserve_original_tz: ``boolean``

    :param validate_value: True to validate that the date is in the ISO8601 format.
    :type validate_value: ``boolean``

    :rtype: ``datetime.datetime``
    
st2common/st2common/util/isotime.py