1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- # -*- coding: utf-8 -*-
- # Copyright (c) 2021, Brandon Nielsen
- # All rights reserved.
- #
- # This software may be modified and distributed under the terms
- # of the BSD license. See the LICENSE file for details.
- from aniso8601.builders.python import PythonTimeBuilder
- from aniso8601.compat import is_string
- from aniso8601.exceptions import ISOFormatError
- def parse_timezone(tzstr, builder=PythonTimeBuilder):
- # tzstr can be Z, ±hh:mm, ±hhmm, ±hh
- if is_string(tzstr) is False:
- raise ValueError("Time zone must be string.")
- if len(tzstr) == 1 and tzstr[0] == "Z":
- return builder.build_timezone(negative=False, Z=True, name=tzstr)
- elif len(tzstr) == 6:
- # ±hh:mm
- hourstr = tzstr[1:3]
- minutestr = tzstr[4:6]
- if tzstr[0] == "-" and hourstr == "00" and minutestr == "00":
- raise ISOFormatError("Negative ISO 8601 time offset must not " "be 0.")
- elif len(tzstr) == 5:
- # ±hhmm
- hourstr = tzstr[1:3]
- minutestr = tzstr[3:5]
- if tzstr[0] == "-" and hourstr == "00" and minutestr == "00":
- raise ISOFormatError("Negative ISO 8601 time offset must not " "be 0.")
- elif len(tzstr) == 3:
- # ±hh
- hourstr = tzstr[1:3]
- minutestr = None
- if tzstr[0] == "-" and hourstr == "00":
- raise ISOFormatError("Negative ISO 8601 time offset must not " "be 0.")
- else:
- raise ISOFormatError('"{0}" is not a valid ISO 8601 time offset.'.format(tzstr))
- for componentstr in [hourstr, minutestr]:
- if componentstr is not None:
- if componentstr.isdigit() is False:
- raise ISOFormatError(
- '"{0}" is not a valid ISO 8601 time offset.'.format(tzstr)
- )
- if tzstr[0] == "+":
- return builder.build_timezone(
- negative=False, hh=hourstr, mm=minutestr, name=tzstr
- )
- if tzstr[0] == "-":
- return builder.build_timezone(
- negative=True, hh=hourstr, mm=minutestr, name=tzstr
- )
- raise ISOFormatError('"{0}" is not a valid ISO 8601 time offset.'.format(tzstr))
|