Das Problem bei der Verwendung von dateutil besteht darin, dass Sie nicht sowohl für die Serialisierung als auch für die Deserialisierung dieselbe Formatzeichenfolge verwenden können, da dateutil nur über begrenzte Formatierungsoptionen verfügt (nur dayfirst
und yearfirst
).
In meiner Anwendung speichere ich die Formatzeichenfolge in einer INI-Datei, und jede Bereitstellung kann ein eigenes Format haben. Daher mag ich den Dateutil-Ansatz wirklich nicht.
Hier ist eine alternative Methode, die stattdessen Pytz verwendet:
from datetime import datetime, timedelta
from pytz import timezone, utc
from pytz.tzinfo import StaticTzInfo
class OffsetTime(StaticTzInfo):
def __init__(self, offset):
"""A dumb timezone based on offset such as +0530, -0600, etc.
"""
hours = int(offset[:3])
minutes = int(offset[0] + offset[3:])
self._utcoffset = timedelta(hours=hours, minutes=minutes)
def load_datetime(value, format):
if format.endswith('%z'):
format = format[:-2]
offset = value[-5:]
value = value[:-5]
return OffsetTime(offset).localize(datetime.strptime(value, format))
return datetime.strptime(value, format)
def dump_datetime(value, format):
return value.strftime(format)
value = '2009/05/13 19:19:30 -0400'
format = '%Y/%m/%d %H:%M:%S %z'
assert dump_datetime(load_datetime(value, format), format) == value
assert datetime(2009, 5, 13, 23, 19, 30, tzinfo=utc) \
.astimezone(timezone('US/Eastern')) == load_datetime(value, format)
dateutil
2.1) mit Python2.7.2
; Python 3 ist nicht erforderlich. Beachten Sie, dass bei der Installation von pip der Paketname lautetpython-dateutil
.