3 """Functions for processing times without dates
5 As defined in :RFC:`5545`, section 3.3.12 (Time).
8 import datetime as _datetime
12 from . import base as _base
15 class Time (_base.DataType):
19 def decode(cls, property, value):
20 """Decode times without dates
22 As defined in :RFC:`5545`, section 3.3.12 (Time).
24 >>> Time.decode(property={}, value='230000')
26 >>> Time.decode(property={}, value='070000Z')
27 datetime.time(7, 0, tzinfo=datetime.timezone.utc)
28 >>> Time.decode(property={}, value='083000')
30 >>> Time.decode(property={}, value='133000Z')
31 datetime.time(13, 30, tzinfo=datetime.timezone.utc)
32 >>> Time.decode(property={'TZID': 'America/New_York'}, value='083000')
33 ... # doctest: +NORMALIZE_WHITESPACE
35 tzinfo=<DstTzInfo 'America/New_York' EST-1 day, 19:00:00 STD>)
37 tzinfo = property.get('TZID', None)
38 if len(value) not in [6,7]:
39 raise ValueError(value)
40 hour = int(value[0:2])
41 minute = int(value[2:4])
42 second = int(value[4:6])
43 if second == 60: # positive leap second not supported by Python
45 if value.endswith('Z'):
46 tzinfo = _datetime.timezone.utc
48 tzinfo = _pytz.timezone(tzinfo)
49 return _datetime.time(
50 hour=hour, minute=minute, second=second, tzinfo=tzinfo)
53 def encode(cls, property, value):
54 if value.tzinfo == _datetime.timezone.utc:
55 return value.strftime('%H%M%SZ')
56 return value.strftime('%H%M%S')