Skip to content

Commit

Permalink
fix: handle parsing ISO datetimes where the microseconds round up to …
Browse files Browse the repository at this point in the history
…1s or more (#1084)
  • Loading branch information
tonyandrewmeyer authored Nov 29, 2023
1 parent a7f34cb commit 681bce2
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 1 deletion.
6 changes: 5 additions & 1 deletion ops/_private/timeconv.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,8 @@ def parse_rfc3339(s: str) -> datetime.datetime:
that Go's encoding/json package produces for time.Time values.
Unfortunately we can't use datetime.fromisoformat(), as that does not
support more than 6 digits for the fractional second, nor the 'Z' for UTC.
support more than 6 digits for the fractional second, nor the 'Z' for UTC,
in Python 3.8 (Python 3.11+ has the required functionality).
"""
match = _TIMESTAMP_RE.match(s)
if not match:
Expand All @@ -50,6 +51,9 @@ def parse_rfc3339(s: str) -> datetime.datetime:
tz = datetime.timezone(tz_delta if sign == '+' else -tz_delta)

microsecond = round(float(sfrac or '0') * 1000000)
# Ignore any overflow into the seconds - this aligns with the Python
# standard library behaviour.
microsecond = min(microsecond, 999999)

return datetime.datetime(int(y), int(m), int(d), int(hh), int(mm), int(ss),
microsecond=microsecond, tzinfo=tz)
6 changes: 6 additions & 0 deletions test/test_private.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,12 @@ def test_parse_rfc3339(self):
self.assertEqual(timeconv.parse_rfc3339('2020-12-25T13:45:50.123456789+00:00'),
datetime.datetime(2020, 12, 25, 13, 45, 50, 123457, tzinfo=utc))

self.assertEqual(timeconv.parse_rfc3339('2006-08-28T13:20:00.9999999Z'),
datetime.datetime(2006, 8, 28, 13, 20, 0, 999999, tzinfo=utc))

self.assertEqual(timeconv.parse_rfc3339('2006-12-31T23:59:59.9999999Z'),
datetime.datetime(2006, 12, 31, 23, 59, 59, 999999, tzinfo=utc))

tzinfo = datetime.timezone(datetime.timedelta(hours=-11, minutes=-30))
self.assertEqual(timeconv.parse_rfc3339('2020-12-25T13:45:50.123456789-11:30'),
datetime.datetime(2020, 12, 25, 13, 45, 50, 123457, tzinfo=tzinfo))
Expand Down

0 comments on commit 681bce2

Please sign in to comment.