Skip to content

Instantly share code, notes, and snippets.

@jcarley
Forked from ergoithz/json.py
Created September 16, 2022 18:10
Show Gist options
  • Select an option

  • Save jcarley/036ae89484bd40d046c8e51a8a8b3c1b to your computer and use it in GitHub Desktop.

Select an option

Save jcarley/036ae89484bd40d046c8e51a8a8b3c1b to your computer and use it in GitHub Desktop.
python json datetime encoder
import json
import time
import datetime
import dateutil.tz
class JSONEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime.datetime):
offset = obj.utcoffset()
return {
'type': 'datetime',
'data': [time.mktime(obj.utctimetuple()), (-time.timezone) if offset is None else offset.seconds]
}
if isinstance(obj, datetime.date):
return {
'type': 'date',
'data': time.mktime(obj.utctimetuple())
}
return super(JSONEncoder, self).default(obj)
def default_object_hook(obj):
if 'type' in obj and 'data' in obj:
if obj['type'] == 'datetime':
ts, offset = obj['data']
return datetime.datetime.fromtimestamp(ts, dateutil.tz.tzoffset(None, offset))
if obj['type'] == 'datetime':
return datetime.date.fromtimestamp(obj['data'])
return obj
def dumps(*args, **kwargs):
kwargs.setdefault('cls', JSONEncoder)
return json.dumps(*args, **kwargs)
def loads(*args, **kwargs):
kwargs.setdefault('object_hook', default_object_hook)
return json.loads(*args, **kwargs)
a = datetime.datetime.now()
b = dumps(a)
print(a)
print(b)
print(loads(b))
import pytz
a = datetime.datetime.now()
a = pytz.timezone('Europe/Berlin').localize(a)
b = dumps(a)
print(a)
print(b)
print(loads(b))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment