Skip to content
This repository was archived by the owner on Mar 13, 2022. It is now read-only.

Commit ca007f3

Browse files
committed
parse microseconds
1 parent 4f7bcfa commit ca007f3

File tree

2 files changed

+29
-10
lines changed

2 files changed

+29
-10
lines changed

config/dateutil.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ def dst(self, dt):
4646
re.VERBOSE + re.IGNORECASE)
4747
_re_timezone = re.compile(r"([-+])(\d\d?):?(\d\d)?")
4848

49+
MICROSEC_PER_SEC = 1000000
50+
4951

5052
def parse_rfc3339(s):
5153
if isinstance(s, datetime.datetime):
@@ -57,8 +59,10 @@ def parse_rfc3339(s):
5759
dt = [0] * 7
5860
for x in range(6):
5961
dt[x] = int(groups[x])
62+
us = 0
6063
if groups[6] is not None:
61-
dt[6] = int(groups[6])
64+
partial_sec = float(groups[6].replace(",", "."))
65+
us = int(MICROSEC_PER_SEC * partial_sec)
6266
tz = UTC
6367
if groups[7] is not None and groups[7] != 'Z' and groups[7] != 'z':
6468
tz_groups = _re_timezone.search(groups[7]).groups()
@@ -72,7 +76,7 @@ def parse_rfc3339(s):
7276
return datetime.datetime(
7377
year=dt[0], month=dt[1], day=dt[2],
7478
hour=dt[3], minute=dt[4], second=dt[5],
75-
microsecond=dt[6], tzinfo=tz)
79+
microsecond=us, tzinfo=tz)
7680

7781

7882
def format_rfc3339(date_time):

config/dateutil_test.py

+23-8
Original file line numberDiff line numberDiff line change
@@ -22,24 +22,39 @@
2222

2323
class DateUtilTest(unittest.TestCase):
2424

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

3030
def test_parse_rfc3339(self):
3131
self._parse_rfc3339_test("2017-07-25T04:44:21Z",
32-
2017, 7, 25, 4, 44, 21)
32+
2017, 7, 25, 4, 44, 21, 0)
3333
self._parse_rfc3339_test("2017-07-25 04:44:21Z",
34-
2017, 7, 25, 4, 44, 21)
34+
2017, 7, 25, 4, 44, 21, 0)
3535
self._parse_rfc3339_test("2017-07-25T04:44:21",
36-
2017, 7, 25, 4, 44, 21)
36+
2017, 7, 25, 4, 44, 21, 0)
3737
self._parse_rfc3339_test("2017-07-25T04:44:21z",
38-
2017, 7, 25, 4, 44, 21)
38+
2017, 7, 25, 4, 44, 21, 0)
3939
self._parse_rfc3339_test("2017-07-25T04:44:21+03:00",
40-
2017, 7, 25, 1, 44, 21)
40+
2017, 7, 25, 1, 44, 21, 0)
4141
self._parse_rfc3339_test("2017-07-25T04:44:21-03:00",
42-
2017, 7, 25, 7, 44, 21)
42+
2017, 7, 25, 7, 44, 21, 0)
43+
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-25T04:44:21.005Z",
47+
2017, 7, 25, 4, 44, 21, 5000)
48+
self._parse_rfc3339_test("2017-07-25 04:44:21.0050Z",
49+
2017, 7, 25, 4, 44, 21, 5000)
50+
self._parse_rfc3339_test("2017-07-25T04:44:21.5",
51+
2017, 7, 25, 4, 44, 21, 500000)
52+
self._parse_rfc3339_test("2017-07-25T04:44:21.005z",
53+
2017, 7, 25, 4, 44, 21, 5000)
54+
self._parse_rfc3339_test("2017-07-25T04:44:21.005+03:00",
55+
2017, 7, 25, 1, 44, 21, 5000)
56+
self._parse_rfc3339_test("2017-07-25T04:44:21.005-03:00",
57+
2017, 7, 25, 7, 44, 21, 5000)
4358

4459
def test_format_rfc3339(self):
4560
self.assertEqual(

0 commit comments

Comments
 (0)