import logging
 import math
-from datetime import datetime
+from datetime import datetime, timezone
 from functools import partial
 from typing import Any, Dict
 
                 for trash in images:
                     trash['pool_name'] = pool_name
                     trash['namespace'] = namespace
-                    trash['deletion_time'] = "{}Z".format(trash['deletion_time'].isoformat())
-                    trash['deferment_end_time'] = "{}Z".format(
-                        trash['deferment_end_time'].isoformat())
+                    trash['deletion_time'] = trash['deletion_time'].isoformat()
+                    trash['deferment_end_time'] = trash['deferment_end_time'].isoformat()
                     result.append(trash)
             return result
 
     @allow_empty_body
     def purge(self, pool_name=None):
         """Remove all expired images from trash."""
-        now = "{}Z".format(datetime.utcnow().isoformat())
+        now = datetime.now(timezone.utc).isoformat()
         pools = self._trash_list(pool_name)
 
         for pool in pools:
 
 
 
 import logging
-from datetime import datetime
+from datetime import datetime, timezone
 
 from .. import mgr
 from . import rbd  # pylint: disable=no-name-in-module
             task.update({
                 'name': "rbd/{}".format(action),
                 'metadata': metadata,
-                'begin_time': "{}Z".format(datetime.fromtimestamp(event["started_at"])
-                                           .isoformat()),
+                'begin_time': datetime.fromtimestamp(
+                    event["started_at"], tz=timezone.utc).isoformat(),
             })
             return
 
         # from the progress module
         'name': "progress/{}".format(event['message']),
         'metadata': dict(event.get('refs', {})),
-        'begin_time': "{}Z".format(datetime.fromtimestamp(event["started_at"])
-                                   .isoformat()),
+        'begin_time': datetime.fromtimestamp(
+            event["started_at"], tz=timezone.utc).isoformat(),
     })
 
 
         })
     else:
         task.update({
-            'end_time': "{}Z".format(datetime.fromtimestamp(event['finished_at'])
-                                     .isoformat()),
+            'end_time': datetime.fromtimestamp(
+                event['finished_at'], tz=timezone.utc).isoformat(),
             'duration': event['finished_at'] - event['started_at'],
             'progress': 100,
             'success': 'failed' not in event,
 
             del stat['parent_pool']
             del stat['parent_name']
 
-            stat['timestamp'] = "{}Z".format(img.create_timestamp()
-                                             .isoformat())
+            stat['timestamp'] = img.create_timestamp().isoformat()
 
             stat['stripe_count'] = img.stripe_count()
             stat['stripe_unit'] = img.stripe_unit()
                 if mirror_mode:
                     snap['mirror_mode'] = mirror_mode
 
-                snap['timestamp'] = "{}Z".format(
-                    img.get_snap_timestamp(snap['id']).isoformat())
+                snap['timestamp'] = img.get_snap_timestamp(snap['id']).isoformat()
 
                 snap['is_protected'] = None
                 if snap['namespace'] == rbd.RBD_SNAP_NAMESPACE_TYPE_USER:
             img['unique_id'] = img_spec
             img['pool_name'] = pool_name
             img['namespace'] = namespace
-            img['deletion_time'] = "{}Z".format(img['deletion_time'].isoformat())
-            img['deferment_end_time'] = "{}Z".format(img['deferment_end_time'].isoformat())
+            img['deletion_time'] = img['deletion_time'].isoformat()
+            img['deferment_end_time'] = img['deferment_end_time'].isoformat()
             return img
         raise rbd.ImageNotFound('No image {} in status `REMOVING` found.'.format(img_spec),
                                 errno=errno.ENOENT)
 
             'unique_id': 'test_pool/3c1a5ee60a88',
             'name': 'test_rbd',
             'source': 'REMOVING',
-            'deletion_time': '{}Z'.format(time.isoformat()),
-            'deferment_end_time': '{}Z'.format(time.isoformat()),
+            'deletion_time': time.isoformat(),
+            'deferment_end_time': time.isoformat(),
             'pool_name': 'test_pool',
             'namespace': ''
         })
             'unique_id': 'test_pool/3c1a5ee60a88',
             'name': 'test_rbd',
             'source': 'REMOVING',
-            'deletion_time': '{}Z'.format(time.isoformat()),
-            'deferment_end_time': '{}Z'.format(time.isoformat()),
+            'deletion_time': time.isoformat(),
+            'deferment_end_time': time.isoformat(),
             'pool_name': 'test_pool',
             'namespace': ''
         }
             'unique_id': 'test_pool/3c1a5ee60a88',
             'name': 'test_rbd',
             'source': 'REMOVING',
-            'deletion_time': '{}Z'.format(time.isoformat()),
-            'deferment_end_time': '{}Z'.format(time.isoformat()),
+            'deletion_time': time.isoformat(),
+            'deferment_end_time': time.isoformat(),
             'pool_name': 'test_pool',
             'namespace': ''
         }], 1))
 
 import threading
 import time
 import urllib
-from datetime import datetime, timedelta
+from datetime import datetime, timedelta, timezone
 
 import cherrypy
 from ceph.utils import strtobool
         return [{
             'name': t.name,
             'metadata': t.metadata,
-            'begin_time': "{}Z".format(datetime.fromtimestamp(t.begin_time).isoformat()),
+            'begin_time': datetime.fromtimestamp(t.begin_time, tz=timezone.utc).isoformat(),
             'progress': t.progress
         } for t in ex_t if t.begin_time], [{
             'name': t.name,
             'metadata': t.metadata,
-            'begin_time': "{}Z".format(datetime.fromtimestamp(t.begin_time).isoformat()),
-            'end_time': "{}Z".format(datetime.fromtimestamp(t.end_time).isoformat()),
+            'begin_time': datetime.fromtimestamp(t.begin_time, tz=timezone.utc).isoformat(),
+            'end_time': datetime.fromtimestamp(t.end_time, tz=timezone.utc).isoformat(),
             'duration': t.duration,
             'progress': t.progress,
             'success': not t.exception,