Skip to content

Commit e04db97

Browse files
authored
fix: parse microseconds in data-time fields (#80)
1 parent c2452f8 commit e04db97

File tree

2 files changed

+30
-10
lines changed

2 files changed

+30
-10
lines changed

kubernetes_asyncio/config/dateutil.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@ def dst(self, dt):
4545
_re_timezone = re.compile(r"([-+])(\d\d?):?(\d\d)?")
4646

4747

48+
MICROSEC_PER_SEC = 1000000
49+
50+
4851
def parse_rfc3339(s):
4952
if isinstance(s, datetime.datetime):
5053
# no need to parse it, just make sure it has a timezone.
@@ -55,8 +58,10 @@ def parse_rfc3339(s):
5558
dt = [0] * 7
5659
for x in range(6):
5760
dt[x] = int(groups[x])
61+
us = 0
5862
if groups[6] is not None:
59-
dt[6] = int(groups[6])
63+
partial_sec = float(groups[6].replace(",", "."))
64+
us = int(MICROSEC_PER_SEC * partial_sec)
6065
tz = UTC
6166
if groups[7] is not None and groups[7] != 'Z' and groups[7] != 'z':
6267
tz_groups = _re_timezone.search(groups[7]).groups()
@@ -70,7 +75,7 @@ def parse_rfc3339(s):
7075
return datetime.datetime(
7176
year=dt[0], month=dt[1], day=dt[2],
7277
hour=dt[3], minute=dt[4], second=dt[5],
73-
microsecond=dt[6], tzinfo=tz)
78+
microsecond=us, tzinfo=tz)
7479

7580

7681
def format_rfc3339(date_time):

kubernetes_asyncio/config/dateutil_test.py

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,24 +20,39 @@
2020

2121
class DateUtilTest(unittest.TestCase):
2222

23-
def _parse_rfc3339_test(self, st, y, m, d, h, mn, s):
23+
def _parse_rfc3339_test(self, st, y, m, d, h, mn, s, us):
2424
actual = parse_rfc3339(st)
25-
expected = datetime(y, m, d, h, mn, s, 0, UTC)
25+
expected = datetime(y, m, d, h, mn, s, us, UTC)
2626
self.assertEqual(expected, actual)
2727

2828
def test_parse_rfc3339(self):
2929
self._parse_rfc3339_test("2017-07-25T04:44:21Z",
30-
2017, 7, 25, 4, 44, 21)
30+
2017, 7, 25, 4, 44, 21, 0)
3131
self._parse_rfc3339_test("2017-07-25 04:44:21Z",
32-
2017, 7, 25, 4, 44, 21)
32+
2017, 7, 25, 4, 44, 21, 0)
3333
self._parse_rfc3339_test("2017-07-25T04:44:21",
34-
2017, 7, 25, 4, 44, 21)
34+
2017, 7, 25, 4, 44, 21, 0)
3535
self._parse_rfc3339_test("2017-07-25T04:44:21z",
36-
2017, 7, 25, 4, 44, 21)
36+
2017, 7, 25, 4, 44, 21, 0)
3737
self._parse_rfc3339_test("2017-07-25T04:44:21+03:00",
38-
2017, 7, 25, 1, 44, 21)
38+
2017, 7, 25, 1, 44, 21, 0)
3939
self._parse_rfc3339_test("2017-07-25T04:44:21-03:00",
40-
2017, 7, 25, 7, 44, 21)
40+
2017, 7, 25, 7, 44, 21, 0)
41+
42+
self._parse_rfc3339_test("2017-07-25T04:44:21,005Z",
43+
2017, 7, 25, 4, 44, 21, 5000)
44+
self._parse_rfc3339_test("2017-07-25T04:44:21.005Z",
45+
2017, 7, 25, 4, 44, 21, 5000)
46+
self._parse_rfc3339_test("2017-07-25 04:44:21.0050Z",
47+
2017, 7, 25, 4, 44, 21, 5000)
48+
self._parse_rfc3339_test("2017-07-25T04:44:21.5",
49+
2017, 7, 25, 4, 44, 21, 500000)
50+
self._parse_rfc3339_test("2017-07-25T04:44:21.005z",
51+
2017, 7, 25, 4, 44, 21, 5000)
52+
self._parse_rfc3339_test("2017-07-25T04:44:21.005+03:00",
53+
2017, 7, 25, 1, 44, 21, 5000)
54+
self._parse_rfc3339_test("2017-07-25T04:44:21.005-03:00",
55+
2017, 7, 25, 7, 44, 21, 5000)
4156

4257
def test_format_rfc3339(self):
4358
self.assertEqual(

0 commit comments

Comments
 (0)