def parse_time(timestring): ''' Parses ISO 8601 times into datetime.time objects. Following ISO 8601 formats are supported: (as decimal separator a ',' or a '.' is allowed) hhmmss.ssTZD basic complete time hh:mm:ss.ssTZD extended compelte time hhmm.mmTZD basic reduced accuracy time hh:mm.mmTZD extended reduced accuracy time hh.hhTZD basic reduced accuracy time TZD is the time zone designator which can be in the following format: no designator indicates local time zone Z UTC +-hhmm basic hours and minutes +-hh:mm extended hours and minutes +-hh hours ''' isotimes = build_time_regexps() for pattern in isotimes: match = pattern.match(timestring) if match: groups = match.groupdict() for key, value in groups.items(): if value is not None: groups[key] = value.replace(',', '.') tzinfo = build_tzinfo(groups['tzname'], groups['tzsign'], int(groups['tzhour'] or 0), int(groups['tzmin'] or 0)) if 'second' in groups: # round to microseconds if fractional seconds are more precise second = Decimal(groups['second']).quantize(Decimal('.000001')) second = min(second, Decimal('59.999999')) microsecond = (second - int(second)) * int(1e6) # int(...) ... no rounding # to_integral() ... rounding return time(int(groups['hour']), int(groups['minute']), int(second), int(microsecond.to_integral()), tzinfo) if 'minute' in groups: minute = Decimal(groups['minute']) second = (minute - int(minute)) * 60 microsecond = (second - int(second)) * int(1e6) return time(int(groups['hour']), int(minute), int(second), int(microsecond.to_integral()), tzinfo) else: microsecond, second, minute = 0, 0, 0 hour = Decimal(groups['hour']) minute = (hour - int(hour)) * 60 second = (minute - int(minute)) * 60 microsecond = (second - int(second)) * int(1e6) return time(int(hour), int(minute), int(second), int(microsecond.to_integral()), tzinfo) raise ISO8601Error('Unrecognised ISO 8601 time format: %r' % timestring)
def parse_time(timestring): ''' Parses ISO 8601 times into datetime.time objects. Following ISO 8601 formats are supported: (as decimal separator a ',' or a '.' is allowed) hhmmss.ssTZD basic complete time hh:mm:ss.ssTZD extended compelte time hhmm.mmTZD basic reduced accuracy time hh:mm.mmTZD extended reduced accuracy time hh.hhTZD basic reduced accuracy time TZD is the time zone designator which can be in the following format: no designator indicates local time zone Z UTC +-hhmm basic hours and minutes +-hh:mm extended hours and minutes +-hh hours ''' isotimes = build_time_regexps() for pattern in isotimes: match = pattern.match(timestring) if match: groups = match.groupdict() for key, value in groups.items(): if value is not None: groups[key] = value.replace(',', '.') tzinfo = build_tzinfo(groups['tzname'], groups['tzsign'], int(groups['tzhour'] or 0), int(groups['tzmin'] or 0)) if 'second' in groups: # round to microseconds if fractional seconds are more precise second = Decimal(groups['second']).quantize(Decimal('.000001')) microsecond = (second - int(second)) * long(1e6) # int(...) ... no rounding # to_integral() ... rounding return time(int(groups['hour']), int(groups['minute']), int(second), int(microsecond.to_integral()), tzinfo) if 'minute' in groups: minute = Decimal(groups['minute']) second = (minute - int(minute)) * 60 microsecond = (second - int(second)) * long(1e6) return time(int(groups['hour']), int(minute), int(second), int(microsecond.to_integral()), tzinfo) else: microsecond, second, minute = 0, 0, 0 hour = Decimal(groups['hour']) minute = (hour - int(hour)) * 60 second = (minute - int(minute)) * 60 microsecond = (second - int(second)) * long(1e6) return time(int(hour), int(minute), int(second), int(microsecond.to_integral()), tzinfo) raise ISO8601Error('Unrecognised ISO 8601 time format: %r' % timestring)
def parse_time(timestring): ''' Parses ISO 8601 times into datetime.time objects. Following ISO 8601 formats are supported: (as decimal separator a ',' or a '.' is allowed) hhmmss.ssTZD basic complete time hh:mm:ss.ssTZD extended compelte time hhmm.mmTZD basic reduced accuracy time hh:mm.mmTZD extended reduced accuracy time hh.hhTZD basic reduced accuracy time TZD is the time zone designator which can be in the following format: no designator indicates local time zone Z UTC +-hhmm basic hours and minutes +-hh:mm extended hours and minutes +-hh hours ''' isotimes = build_time_regexps() for pattern in isotimes: match = pattern.match(timestring) if match: groups = match.groupdict() for key, value in groups.items(): if value is not None: groups[key] = value.replace(',', '.') tzinfo = build_tzinfo(groups['tzname'], groups['tzsign'], int(groups['tzhour'] or 0), int(groups['tzmin'] or 0)) if 'second' in groups: frac, second = math.modf(float(groups['second'])) microsecond = frac * 1e6 return time(int(groups['hour']), int(groups['minute']), int(second), int(microsecond), tzinfo) if 'minute' in groups: frac, minute = math.modf(float(groups['minute'])) frac, second = math.modf(frac * 60.0) microsecond = frac * 1e6 return time(int(groups['hour']), int(minute), int(second), int(microsecond), tzinfo) else: microsecond, second, minute = 0, 0, 0 frac, hour = math.modf(float(groups['hour'])) frac, minute = math.modf(frac * 60.0) frac, second = math.modf(frac * 60.0) microsecond = frac * 1e6 return time(int(hour), int(minute), int(second), int(microsecond), tzinfo) raise ISO8601Error('Unrecognised ISO 8601 time format: %r' % timestring)
def parse_time(timestring): """ Parses ISO 8601 times into datetime.time objects. Following ISO 8601 formats are supported: (as decimal separator a ',' or a '.' is allowed) hhmmss.ssTZD basic complete time hh:mm:ss.ssTZD extended compelte time hhmm.mmTZD basic reduced accuracy time hh:mm.mmTZD extended reduced accuracy time hh.hhTZD basic reduced accuracy time TZD is the time zone designator which can be in the following format: no designator indicates local time zone Z UTC +-hhmm basic hours and minutes +-hh:mm extended hours and minutes +-hh hours """ isotimes = build_time_regexps() for pattern in isotimes: match = pattern.match(timestring) if match: groups = match.groupdict() for key, value in groups.items(): if value is not None: groups[key] = value.replace(",", ".") tzinfo = build_tzinfo( groups["tzname"], groups["tzsign"], int(groups["tzhour"] or 0), int(groups["tzmin"] or 0) ) if "second" in groups: frac, second = math.modf(float(groups["second"])) microsecond = frac * 1e6 return time(int(groups["hour"]), int(groups["minute"]), int(second), int(microsecond), tzinfo) if "minute" in groups: frac, minute = math.modf(float(groups["minute"])) frac, second = math.modf(frac * 60.0) microsecond = frac * 1e6 return time(int(groups["hour"]), int(minute), int(second), int(microsecond), tzinfo) else: microsecond, second, minute = 0, 0, 0 frac, hour = math.modf(float(groups["hour"])) frac, minute = math.modf(frac * 60.0) frac, second = math.modf(frac * 60.0) microsecond = frac * 1e6 return time(int(hour), int(minute), int(second), int(microsecond), tzinfo) raise ISO8601Error("Unrecognised ISO 8601 time format: %r" % timestring)
def parse_time(timestring): """ Parses ISO 8601 times into datetime.time objects. Following ISO 8601 formats are supported: (as decimal separator a ',' or a '.' is allowed) hhmmss.ssTZD basic complete time hh:mm:ss.ssTZD extended complete time hhmm.mmTZD basic reduced accuracy time hh:mm.mmTZD extended reduced accuracy time hh.hhTZD basic reduced accuracy time TZD is the time zone designator which can be in the following format: no designator indicates local time zone Z UTC +-hhmm basic hours and minutes +-hh:mm extended hours and minutes +-hh hours """ isotimes = build_time_regexps() for pattern in isotimes: match = pattern.match(timestring) if match: groups = match.groupdict() for key, value in groups.items(): if value is not None: groups[key] = value.replace(",", ".") tzinfo = build_tzinfo( groups["tzname"], groups["tzsign"], int(groups["tzhour"] or 0), int(groups["tzmin"] or 0), ) if "second" in groups: second = Decimal(groups["second"]).quantize( Decimal(".000001"), rounding=ROUND_FLOOR ) microsecond = (second - int(second)) * int(1e6) # int(...) ... no rounding # to_integral() ... rounding return time( int(groups["hour"]), int(groups["minute"]), int(second), int(microsecond.to_integral()), tzinfo, ) if "minute" in groups: minute = Decimal(groups["minute"]) second = Decimal((minute - int(minute)) * 60).quantize( Decimal(".000001"), rounding=ROUND_FLOOR ) microsecond = (second - int(second)) * int(1e6) return time( int(groups["hour"]), int(minute), int(second), int(microsecond.to_integral()), tzinfo, ) else: microsecond, second, minute = 0, 0, 0 hour = Decimal(groups["hour"]) minute = (hour - int(hour)) * 60 second = (minute - int(minute)) * 60 microsecond = (second - int(second)) * int(1e6) return time( int(hour), int(minute), int(second), int(microsecond.to_integral()), tzinfo, ) raise ISO8601Error("Unrecognised ISO 8601 time format: %r" % timestring)