def parse(cls, tzinfo_string: str) -> dt_tzinfo:
        """
        Parse a timezone string and return a datetime timezone object.

        :param tzinfo_string: The timezone string to parse.
        :type tzinfo_string: str
        :returns: The parsed datetime timezone object.
        :rtype: datetime.timezone
        :raises ParserError: If the timezone string cannot be parsed.
        """
        tzinfo: Optional[dt_tzinfo] = None

        if tzinfo_string == "local":
            tzinfo = tz.tzlocal()

        elif tzinfo_string in ["utc", "UTC", "Z"]:
            tzinfo = tz.tzutc()

        else:
            iso_match = cls._TZINFO_RE.match(tzinfo_string)

            if iso_match:
                sign: Optional[str]
                hours: str
                minutes: Union[str, int, None]
                sign, hours, minutes = iso_match.groups()
                seconds = int(hours) * 3600 + int(minutes or 0) * 60

                if sign == "-":
                    seconds *= -1

                tzinfo = tz.tzoffset(None, seconds)

            else:
                tzinfo = tz.gettz(tzinfo_string)

        if tzinfo is None:
            raise ParserError(f"Could not parse timezone expression {tzinfo_string!r}.")

        return tzinfo

        Parse a timezone string and return a datetime timezone object.

        :param tzinfo_string: The timezone string to parse.
        :type tzinfo_string: str
        :returns: The parsed datetime timezone object.
        :rtype: datetime.timezone
        :raises ParserError: If the timezone string cannot be parsed.
        
arrow/parser.py