changeset 3878:32087d7c25d4

tools (datetime, utils): fix incorrect use of naive object: `tools.datetime.format_datetime` was expecting aware datetime objects while `tools.utils.xmpp_date` was returning naive datetime objects. A check has been added to the former one, and latter one has been modified to return aware datetime objects.
author Goffi <goffi@goffi.org>
date Wed, 31 Aug 2022 13:11:26 +0200
parents 00212260f659
children 46930301f0c1
files sat/tools/datetime.py sat/tools/utils.py
diffstat 2 files changed, 13 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/sat/tools/datetime.py	Tue Aug 23 12:04:11 2022 +0200
+++ b/sat/tools/datetime.py	Wed Aug 31 13:11:26 2022 +0200
@@ -19,6 +19,7 @@
 # Type-check with `mypy --strict`
 # Lint with `pylint`
 
+from sat.core import exceptions
 from datetime import date, datetime, time, timezone
 import re
 from typing import Optional, Tuple
@@ -95,6 +96,7 @@
 ) -> str:
     """
     @param value: The datetime to format. Defaults to the current datetime.
+        must be an aware datetime object (timezone must be specified)
     @param include_microsecond: Include the microsecond of the datetime in the output.
     @return: The datetime formatted according to the DateTime profile specified in
         XEP-0082. The datetime is always converted to UTC before formatting to avoid
@@ -105,11 +107,14 @@
     # We format the time in UTC, since the %z formatter of strftime doesn't include colons
     # to separate hours and minutes which is required by XEP-0082. UTC allows us to put a
     # simple letter 'Z' as the time zone definition.
-    value = (
-        datetime.now(timezone.utc)
-        if value is None
-        else value.astimezone(timezone.utc)  # pylint: disable=no-member
-    )
+    if value is not None:
+        if value.tzinfo is None:
+            raise exceptions.InternalError(
+                "an aware datetime object must be used, but a naive one has been provided"
+            )
+        value = value.astimezone(timezone.utc)  # pylint: disable=no-member
+    else:
+        value = datetime.now(timezone.utc)
 
     if include_microsecond:
         return value.strftime("%Y-%m-%dT%H:%M:%S.%fZ")
--- a/sat/tools/utils.py	Tue Aug 23 12:04:11 2022 +0200
+++ b/sat/tools/utils.py	Wed Aug 31 13:11:26 2022 +0200
@@ -152,8 +152,9 @@
     @param with_time(bool): if True include the time
     @return(unicode): XEP-0082 formatted date and time
     """
-    dtime = datetime.datetime.utcfromtimestamp(
-        time.time() if timestamp is None else timestamp
+    dtime = datetime.datetime.fromtimestamp(
+        time.time() if timestamp is None else timestamp,
+        datetime.timezone.utc
     )
 
     return format_datetime(dtime) if with_time else format_date(dtime.date())