docs: def parse_iso8601_datetime(string):
      """
      Parse an ISO 8601 date/time string
      """
  
      # Match ISO 8601?
      match = _RE_ISO8601_DATETIME.search(string)
      if not match:
          raise ValueError('Expected ISO 8601 date/time')
  
      # Extract ISO 8601 components
      year = int(match.group('year'))
      month = int(match.group('month'))
      day = int(match.group('day'))
      hour = int(match.group('hour')) if match.group('hour') else 0
      minute = int(match.group('min')) if match.group('min') else 0
      sec = int(match.group('sec')) if match.group('sec') else 0
      microsec = int(float('.' + match.group('fracsec')) * 1000000) if match.group('fracsec') else 0
      offhour = int(match.group('offsign') + match.group('offhour')) if match.group('offhour') else 0
      offmin = int(match.group('offsign') + match.group('offmin')) if match.group('offmin') else 0
  
      return (datetime(year, month, day, hour, minute, sec, microsec, TZUTC) -
              timedelta(hours=offhour, minutes=offmin))