diff --git a/pikatasks/utils.py b/pikatasks/utils.py
index 7f978da994f7c823f7fce374c2fcce85bdbdece5..9f59caa8f2e29f1b9ebd96932cb77f6ad9d66d44 100644
--- a/pikatasks/utils.py
+++ b/pikatasks/utils.py
@@ -2,34 +2,48 @@ import json
 import pika
 import logging
 import ssl
-from datetime import datetime
+from datetime import datetime, timezone
 from . import settings
 
 
 logger = logging.getLogger("pika-tasks")
 
-
 all_tasks = set()  # each registered task will show up here
 
-
-DATETIME_FORMAT = "%Y-%m-%dT%H:%M:%S.%fZ"  # need it to de/serialize datetime stored in JSON
+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
 
 
 def serialize(stuff):
     return json.dumps(stuff).encode("utf-8")
 
 
-def deserialize(binary):
-    return json.loads(binary.decode("utf-8"))
+def deserialize(bytes):
+    return json.loads(bytes.decode("utf-8"))
 
 
 def serialize_datetime(dt):
-    return datetime.strftime(dt, DATETIME_FORMAT)
-
-
-def deserialize_datetime(text):
-    """ Throws ValueError when fails to parse the text """
-    return datetime.strptime(text, DATETIME_FORMAT)
+    """
+    :param dt: datetime (timezone-aware)
+    :return: str that can be deserialized by deserialize_datetime()
+    """
+    if not dt.tzinfo:
+        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):