diff --git a/6-doc-processor.py b/6-doc-processor.py
index eae6c0016d5a13db883529f667dc6b187e89d15d..38d1b2d3240ec57e986a42bd06103d78198dc41c 100644
--- a/6-doc-processor.py
+++ b/6-doc-processor.py
@@ -48,7 +48,7 @@ def fix_field_types( in_docs, out_types ):
             elif out_types[lookup_key] == 'float':
                 out_flattened_properties[prop] = convert_to_float(in_flattened_properties[prop])
             elif out_types[lookup_key] in ['date', 'datetime']:
-                out_flattened_properties[prop] = convert_to_datetime(in_flattened_properties[prop]).strftime('%Y-%m-%dT%H:%M:%SZ')
+                out_flattened_properties[prop] = convert_to_datetime(in_flattened_properties[prop]).strftime('%Y-%m-%dT%H:%M:%S.%fZ')
             elif out_types[lookup_key] == 'bool':
                 out_flattened_properties[prop] = convert_to_boolean(in_flattened_properties[prop])
             else:
diff --git a/utils/serializers.py b/utils/serializers.py
index 04de436f74e9a166783440f5cee5488f9d7b1b62..3632e72f22eafe51fc7c3e35cf9ace41f820fb58 100644
--- a/utils/serializers.py
+++ b/utils/serializers.py
@@ -1,21 +1,76 @@
 import datetime
+import pytz
 
 # cf. https://stackoverflow.com/questions/30313243/messagepack-and-datetime
 def decode_datetime(obj):
     if '__datetime__' in obj.keys():
-        obj = datetime.datetime.strptime(obj["as_str"], "%Y%m%dT%H:%M:%S.%f")
+        tmp = datetime.datetime.strptime(obj["as_str"], "%Y-%m-%dT%H:%M:%S.%fZ")
+        output = pytz.timezone('UTC').localize(tmp)
     elif '__date__' in obj.keys():
-        obj = datetime.datetime.strptime(obj["as_str"], "%Y%m%d")
+        output = datetime.datetime.strptime(obj["as_str"], "%Y-%m-%d")
     else:
-        return obj
+        output = obj
+
+    return output
 
 # cf. https://stackoverflow.com/questions/30313243/messagepack-and-datetime
 def encode_datetime(obj):
     if isinstance(obj, datetime.datetime):
-        return {'__datetime__': True, 'as_str': obj.strftime("%Y%m%dT%H:%M:%S.%f")}
+
+        if obj.tzinfo is None:
+            tmp1 = pytz.timezone("Europe/Paris").localize(obj)
+        else:
+            tmp1 = obj
+
+        tmp2 = tmp1.astimezone(pytz.UTC)
+
+        return {'__datetime__': True, 'as_str': tmp2.strftime("%Y-%m-%dT%H:%M:%S.%fZ")}
 
     if isinstance(obj, datetime.date):
-        return {'__date__': True, 'as_str': obj.strftime("%Y%m%d")}
+        return {'__date__': True, 'as_str': obj.strftime("%Y-%m-%d")}
     # if isinstance(obj, Decimal):
     #     return float(obj)
     return obj
+
+
+if __name__ == '__main__':
+
+    import pytz
+
+    print('DATETIME WITHOUT TIMEZONE')
+    datetime_without_timezone = datetime.datetime.now()
+    print("Original:", datetime_without_timezone)
+
+    encoded = encode_datetime(datetime_without_timezone)
+    print("Encoded:", encoded)
+
+    decoded = decode_datetime(encoded)
+    print("Decoded:", decoded)
+
+
+    print('')
+    print('DATETIME WITH TIMEZONE')
+    # datetime_with_timezone = datetime.datetime.now()
+    tmp = pytz.timezone("Europe/Paris").localize(datetime.datetime.now())
+    datetime_with_timezone = tmp.astimezone(pytz.timezone('America/New_York'))
+    print(datetime_with_timezone)
+
+    print("Original:", datetime_with_timezone)
+
+    encoded = encode_datetime(datetime_with_timezone)
+    print("Encoded:", encoded)
+
+    decoded = decode_datetime(encoded)
+    print("Decoded:", decoded)
+
+
+    print('')
+    print('DATE')
+    date = datetime.date(2019, 3, 10)
+    print("Original:", date)
+
+    encoded = encode_datetime(date)
+    print("Encoded:", encoded)
+
+    decoded = decode_datetime(encoded)
+    print("Decoded:", decoded)