diff options
-rw-r--r-- | openstack/common/timeutils.py | 16 | ||||
-rw-r--r-- | tests/unit/test_timeutils.py | 15 |
2 files changed, 25 insertions, 6 deletions
diff --git a/openstack/common/timeutils.py b/openstack/common/timeutils.py index e2c2740..8e40660 100644 --- a/openstack/common/timeutils.py +++ b/openstack/common/timeutils.py @@ -25,18 +25,22 @@ import datetime import iso8601 -TIME_FORMAT = "%Y-%m-%dT%H:%M:%S" -PERFECT_TIME_FORMAT = "%Y-%m-%dT%H:%M:%S.%f" +# ISO 8601 extended time format with microseconds +_ISO8601_TIME_FORMAT_SUBSECOND = '%Y-%m-%dT%H:%M:%S.%f' +_ISO8601_TIME_FORMAT = '%Y-%m-%dT%H:%M:%S' +PERFECT_TIME_FORMAT = _ISO8601_TIME_FORMAT_SUBSECOND -def isotime(at=None): +def isotime(at=None, subsecond=False): """Stringify time in ISO 8601 format""" if not at: at = utcnow() - str = at.strftime(TIME_FORMAT) + st = at.strftime(_ISO8601_TIME_FORMAT + if not subsecond + else _ISO8601_TIME_FORMAT_SUBSECOND) tz = at.tzinfo.tzname(None) if at.tzinfo else 'UTC' - str += ('Z' if tz == 'UTC' else tz) - return str + st += ('Z' if tz == 'UTC' else tz) + return st def parse_isotime(timestr): diff --git a/tests/unit/test_timeutils.py b/tests/unit/test_timeutils.py index dbab059..96fe5af 100644 --- a/tests/unit/test_timeutils.py +++ b/tests/unit/test_timeutils.py @@ -30,7 +30,10 @@ class TimeUtilsTest(utils.BaseTestCase): def setUp(self): super(TimeUtilsTest, self).setUp() self.skynet_self_aware_time_str = '1997-08-29T06:14:00Z' + self.skynet_self_aware_time_ms_str = '1997-08-29T06:14:00.000123Z' self.skynet_self_aware_time = datetime.datetime(1997, 8, 29, 6, 14, 0) + self.skynet_self_aware_ms_time = datetime.datetime( + 1997, 8, 29, 6, 14, 0, 123) self.one_minute_before = datetime.datetime(1997, 8, 29, 6, 13, 0) self.one_minute_after = datetime.datetime(1997, 8, 29, 6, 15, 0) self.skynet_self_aware_time_perfect_str = '1997-08-29T06:14:00.000000' @@ -44,12 +47,24 @@ class TimeUtilsTest(utils.BaseTestCase): dt = timeutils.isotime() self.assertEqual(dt, self.skynet_self_aware_time_str) + def test_isotimei_micro_second_precision(self): + with mock.patch('datetime.datetime') as datetime_mock: + datetime_mock.utcnow.return_value = self.skynet_self_aware_ms_time + dt = timeutils.isotime(subsecond=True) + self.assertEqual(dt, self.skynet_self_aware_time_ms_str) + def test_parse_isotime(self): expect = timeutils.parse_isotime(self.skynet_self_aware_time_str) skynet_self_aware_time_utc = self.skynet_self_aware_time.replace( tzinfo=iso8601.iso8601.UTC) self.assertEqual(skynet_self_aware_time_utc, expect) + def test_parse_isotime_micro_second_precision(self): + expect = timeutils.parse_isotime(self.skynet_self_aware_time_ms_str) + skynet_self_aware_time_ms_utc = self.skynet_self_aware_ms_time.replace( + tzinfo=iso8601.iso8601.UTC) + self.assertEqual(skynet_self_aware_time_ms_utc, expect) + def test_strtime(self): expect = timeutils.strtime(self.skynet_self_aware_time_perfect) self.assertEqual(self.skynet_self_aware_time_perfect_str, expect) |