def parse(value):
        """Parse the string datetime.

        This supports the subset of ISO8601 used by xsd:dateTime, but is
        lenient with what is accepted, handling most reasonable syntax.

        @param value: A datetime string.
        @type value: str
        @return: A datetime object.
        @rtype: B{datetime}.I{datetime}

        """
        match_result = RE_DATETIME.match(value)
        if match_result is None:
            raise ValueError('date data has invalid format "%s"' % (value, ))

        date = date_from_match(match_result)
        time = time_from_match(match_result)
        tzinfo = tzinfo_from_match(match_result)

        value = datetime.datetime.combine(date, time)
        value = value.replace(tzinfo=tzinfo)

        return value
Parse the string datetime.

        This supports the subset of ISO8601 used by xsd:dateTime, but is
        lenient with what is accepted, handling most reasonable syntax.

        @param value: A datetime string.
        @type value: str
        @return: A datetime object.
        @rtype: B{datetime}.I{datetime}