f4c0178a3aab85af0bccb9838c0f364d322327cc
[pycalendar.git] / pycalendar / dtype / time.py
1 # Copyright
2
3 """Functions for processing times without dates
4
5 As defined in :RFC:`5545`, section 3.3.12 (Time).
6 """
7
8 import datetime as _datetime
9
10 import pytz as _pytz
11
12 from . import base as _base
13
14
15 class Time (_base.DataType):
16     name = 'TIME'
17
18     @classmethod
19     def decode(cls, property, value):
20         """Decode times without dates
21
22         As defined in :RFC:`5545`, section 3.3.12 (Time).
23
24         >>> Time.decode(property={}, value='230000')
25         datetime.time(23, 0)
26         >>> Time.decode(property={}, value='070000Z')
27         datetime.time(7, 0, tzinfo=datetime.timezone.utc)
28         >>> Time.decode(property={}, value='083000')
29         datetime.time(8, 30)
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
34         datetime.time(8, 30,
35           tzinfo=<DstTzInfo 'America/New_York' EST-1 day, 19:00:00 STD>)
36         """
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
44             second = 59
45         if value.endswith('Z'):
46             tzinfo = _datetime.timezone.utc
47         elif tzinfo:
48             tzinfo = _pytz.timezone(tzinfo)
49         return _datetime.time(
50             hour=hour, minute=minute, second=second, tzinfo=tzinfo)
51
52     @classmethod
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')