From 4b184899062c70f5c673f2286e3b7a7c8fde6e76 Mon Sep 17 00:00:00 2001 From: Xie Yanbo Date: Thu, 19 Mar 2020 18:09:21 +0800 Subject: [PATCH] A helpber to format datetime with local timezone --- coverage/backward.py | 26 ++++++++++++++++++++++++++ coverage/html.py | 4 ++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/coverage/backward.py b/coverage/backward.py index 37b491676..92b0cf70a 100644 --- a/coverage/backward.py +++ b/coverage/backward.py @@ -9,6 +9,8 @@ import os import sys +from datetime import datetime + from coverage import env @@ -217,6 +219,30 @@ def __eq__(self, other): return self.__dict__ == other.__dict__ +def format_local_datetime(dt): + """Return a string with local timezone representing the date.""" + try: + return dt.astimezone().strftime('%Y-%m-%d %H:%M %z') + except (TypeError, ValueError): + # Class datetime.timezone introduced in Python 3.2 + # Datetime.astimezone in Python 3.5 can not handle naive datetime + import time + def get_timezone_offset(): + timestamp = time.time() + delta = datetime.fromtimestamp(timestamp) - datetime.utcfromtimestamp(timestamp) + if delta.seconds >= 0: + sign = '+' + seconds = delta.seconds + else: + sign = '-' + seconds = - delta.seconds + hours, rest = divmod(seconds, 60 * 60) + minutes, _ = divmod(rest, 60) + return '%s%02d%02d' % (sign, hours, minutes) + offset = get_timezone_offset() + return '%s %s' % (dt.strftime('%Y-%m-%d %H:%M'), offset) + + def invalidate_import_caches(): """Invalidate any import caches that may or may not exist.""" if importlib and hasattr(importlib, "invalidate_caches"): diff --git a/coverage/html.py b/coverage/html.py index a8aa3f654..3596bbe1d 100644 --- a/coverage/html.py +++ b/coverage/html.py @@ -11,7 +11,7 @@ import coverage from coverage import env -from coverage.backward import iitems, SimpleNamespace +from coverage.backward import iitems, SimpleNamespace, format_local_datetime from coverage.data import add_data_to_hash from coverage.files import flat_rootname from coverage.misc import CoverageException, ensure_dir, file_be_gone, Hasher, isolate_module @@ -200,7 +200,7 @@ def __init__(self, cov): '__url__': coverage.__url__, '__version__': coverage.__version__, 'title': title, - 'time_stamp': datetime.datetime.now().astimezone().strftime('%Y-%m-%d %H:%M %z'), + 'time_stamp': format_local_datetime(datetime.datetime.now()), 'extra_css': self.extra_css, 'has_arcs': self.has_arcs, 'show_contexts': self.config.show_contexts,