Skip to content

Instantly share code, notes, and snippets.

@alonho
Created December 30, 2012 21:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alonho/4415445 to your computer and use it in GitHub Desktop.
Save alonho/4415445 to your computer and use it in GitHub Desktop.
A symmetric-python-datetime-json-codec
from time import mktime
from dateutil.parser import parse
from datetime import datetime
from json import JSONEncoder, JSONDecoder
ISOTIME_IDENTIFITER = '$isotime'
EPOCHTIME_IDENTIFIER = '$epochtime'
class JsonDatetimeEncoder(JSONEncoder):
def default(self, obj):
'''
Encode datetimes both as an iso 8601 and unix timestamp (seconds from the epoch).
>>> JsonDatetimeEncoder().encode(datetime(2012, 12, 30, 23, 29, 35, 579121))
'{"$isotime": "2012-12-30T23:29:35.579121", "$epochtime": 1356902975.579121}'
'''
if isinstance(obj, datetime):
return {ISOTIME_IDENTIFITER: obj.isoformat(),
EPOCHTIME_IDENTIFIER: mktime(obj.timetuple()) + obj.microsecond / 1e6}
return super(JsonDatetimeEncoder, self).default(obj)
class JsonDatetimeDecoder(JSONDecoder):
def __init__(self, **kwargs):
super(JsonDatetimeDecoder, self).__init__(object_hook=self._datetime_object_hook, **kwargs)
def _datetime_object_hook(self, obj):
'''
Decode an iso 8601 or a unix timestamp (seconds from the epoch).
>>> JsonDatetimeDecoder().decode('{"$epochtime": 1356902975.579121}')
datetime.datetime(2012, 12, 30, 23, 29, 35, 579121)
>>> JsonDatetimeDecoder().decode('{"$isotime": "2012-12-30T23:29:35.579121"}')
datetime.datetime(2012, 12, 30, 23, 29, 35, 579121)
'''
if isinstance(obj, dict):
if ISOTIME_IDENTIFITER in obj:
return parse(obj[ISOTIME_IDENTIFITER])
elif EPOCHTIME_IDENTIFIER in obj:
return datetime.fromtimestamp(obj[EPOCHTIME_IDENTIFIER])
return obj
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment