Skip to content
Snippets Groups Projects
Commit f527af0d authored by Art's avatar Art :lizard:
Browse files

Add working timezone support for datetime serialization

parent 0f3f3234
No related branches found
No related tags found
No related merge requests found
...@@ -2,34 +2,48 @@ import json ...@@ -2,34 +2,48 @@ import json
import pika import pika
import logging import logging
import ssl import ssl
from datetime import datetime from datetime import datetime, timezone
from . import settings from . import settings
logger = logging.getLogger("pika-tasks") logger = logging.getLogger("pika-tasks")
all_tasks = set() # each registered task will show up here all_tasks = set() # each registered task will show up here
DATETIME_FORMAT = "%Y-%m-%dT%H:%M:%S.%f%Z%z" # used for serialization, I leave here both %Z%z for compatibility in case we ever want to improve timezone-related stuff
DATETIME_FORMAT = "%Y-%m-%dT%H:%M:%S.%fZ" # need it to de/serialize datetime stored in JSON
def serialize(stuff): def serialize(stuff):
return json.dumps(stuff).encode("utf-8") return json.dumps(stuff).encode("utf-8")
def deserialize(binary): def deserialize(bytes):
return json.loads(binary.decode("utf-8")) return json.loads(bytes.decode("utf-8"))
def serialize_datetime(dt): def serialize_datetime(dt):
return datetime.strftime(dt, DATETIME_FORMAT) """
:param dt: datetime (timezone-aware)
:return: str that can be deserialized by deserialize_datetime()
def deserialize_datetime(text): """
""" Throws ValueError when fails to parse the text """ if not dt.tzinfo:
return datetime.strptime(text, DATETIME_FORMAT) logger.warning("Naive datetime received by serialize_datetime() and will be treated as local: {dt}. Avoid using naive datetime objects.".format(dt=dt))
utc_dt = dt.astimezone(timezone.utc)
return datetime.strftime(utc_dt, DATETIME_FORMAT)
def deserialize_datetime(text, utc=False):
"""
:param text: str created by serialize_datetime()
:param utc: set to True if you want this function to return UTC datetime
:return: datetime (timezone-aware)
"""
dt = datetime.strptime(text, DATETIME_FORMAT)
assert dt.tzinfo, "ok, now that's weird, no tzinfo, but there must have been %z in the DATETIME_FORMAT"
if utc:
return dt.astimezone(timezone.utc)
else:
return dt.astimezone() # not pytz, just old c++ stuff, but still a timezone with correct utc offset
def get_ssl_options(settings): def get_ssl_options(settings):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment