code: def _GetISO8601String(self, structure):
      
      time_offset = structure.time_offset
      month = timelib.MONTH_DICT.get(structure.month.lower(), 0)
  
      try:
        time_offset_hours = int(time_offset[1:3], 10)
        time_offset_minutes = int(time_offset[3:5], 10)
      except (IndexError, TypeError, ValueError) as exception:
        raise ValueError(
            'unable to parse time zone offset with error: {0!s}.'.format(
                exception))
  
      try:
        date_time_string = (
            '{0:04d}-{1:02d}-{2:02d}T{3:02d}:{4:02d}:{5:02d}.000000'
            '{6:s}{7:02d}:{8:02d}').format(
                structure.year, month, structure.day, structure.hours,
                structure.minutes, structure.seconds, time_offset[0],
                time_offset_hours, time_offset_minutes)
      except ValueError as exception:
        raise ValueError(
            'unable to format date time string with error: {0!s}.'.format(
                exception))
  
      return date_time_string
docs: Normalize date time parsed format to an ISO 8601 date time string.
      The date and time values in Apache access log files are formatted as:
      "[18/Sep/2011:19:18:28 -0400]".
  
      Args:
        structure (pyparsing.ParseResults): structure of tokens derived from a
            line of a text file.
  
      Returns:
        str: ISO 8601 date time string.
  
      Raises:
        ValueError: if the structure cannot be converted into a date time string.