You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
# -*- 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))
|