def _CopyDateTimeFromString(self, time_string):
if not time_string:<EOL><INDENT>raise ValueError('<STR_LIT>')<EOL><DEDENT>time_string_length = len(time_string)<EOL>year, month, day_of_month = self._CopyDateFromString(time_string)<EOL>if time_string_length <= <NUM_LIT:10>:<EOL><INDENT>return {<EOL>'<STR_LIT>': year,<EOL>'<STR_LIT>': month,<EOL>'<STR_LIT>': day_of_month}<EOL><DEDENT>if time_string[<NUM_LIT:10>] != '<STR_LIT:U+0020>':<EOL><INDENT>raise ValueError(<EOL>'<STR_LIT>')<EOL><DEDENT>hours, minutes, seconds, microseconds, time_zone_offset = (<EOL>self._CopyTimeFromString(time_string[<NUM_LIT:11>:]))<EOL>if time_zone_offset:<EOL><INDENT>year, month, day_of_month, hours, minutes = self._AdjustForTimeZoneOffset(<EOL>year, month, day_of_month, hours, minutes, time_zone_offset)<EOL><DEDENT>date_time_values = {<EOL>'<STR_LIT>': year,<EOL>'<STR_LIT>': month,<EOL>'<STR_LIT>': day_of_month,<EOL>'<STR_LIT>': hours,<EOL>'<STR_LIT>': minutes,<EOL>'<STR_LIT>': seconds}<EOL>if microseconds is not None:<EOL><INDENT>date_time_values['<STR_LIT>'] = microseconds<EOL><DEDENT>return date_time_values<EOL>
Copies a date and time from a string.

        Args:
          time_string (str): date and time value formatted as:
              YYYY-MM-DD hh:mm:ss.######[+-]##:##

              Where # are numeric digits ranging from 0 to 9 and the seconds
              fraction can be either 3 or 6 digits. The time of day, seconds
              fraction and time zone offset are optional. The default time zone
              is UTC.

        Returns:
          dict[str, int]: date and time values, such as year, month, day of month,
              hours, minutes, seconds, microseconds.

        Raises:
          ValueError: if the time string is invalid or not supported.