summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--openstack/common/timeutils.py16
-rw-r--r--tests/unit/test_timeutils.py15
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)