Wenn Sie Python3.7 verwenden, ist die beste Lösung die Verwendung von datetime.isoformat()
und datetime.fromisoformat()
; sie funktionieren sowohl mit naiven als auch mit bewussten datetime
-Objekten:
#!/usr/bin/env python3.7
from datetime import datetime
from datetime import timezone
from datetime import timedelta
import json
def default(obj):
if isinstance(obj, datetime):
return { '_isoformat': obj.isoformat() }
raise TypeError('...')
def object_hook(obj):
_isoformat = obj.get('_isoformat')
if _isoformat is not None:
return datetime.fromisoformat(_isoformat)
return obj
if __name__ == '__main__':
#d = { 'now': datetime(2000, 1, 1) }
d = { 'now': datetime(2000, 1, 1, tzinfo=timezone(timedelta(hours=-8))) }
s = json.dumps(d, default=default)
print(s)
print(d == json.loads(s, object_hook=object_hook))
Ausgabe:
{"now": {"_isoformat": "2000-01-01T00:00:00-08:00"}}
True
Wenn Sie Python3.6 oder darunter verwenden und nur den Zeitwert interessiert (nicht die Zeitzone), dann können Sie datetime.timestamp()
und datetime.fromtimestamp()
verwenden;
Wenn Sie Python3.6 oder darunter verwenden und die Zeitzone beachten wollen, dann können Sie diese über datetime.tzinfo
erhalten, aber Sie müssen dieses Feld selbst serialisieren; der einfachste Weg, dies zu tun, ist ein weiteres Feld _tzinfo
im serialisierten Objekt hinzuzufügen;
Achten Sie abschließend auf die Genauigkeit in all diesen Beispielen;