Проблема використання dateutil полягає в тому, що ви не можете мати однаковий рядок формату як для серіалізації, так і для десеріалізації, оскільки dateutil має обмежені можливості форматування (лише dayfirst
та yearfirst
).
У моїй програмі я зберігаю рядок формату у файлі .INI, і кожне розгортання може мати свій власний формат. Таким чином, мені дуже не подобається підхід dateutil.
Ось альтернативний метод, який замість цього використовує pytz:
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) з Python2.7.2
; Python 3 не потрібен. Зверніть увагу, що якщо ви встановлюєте з pip, ім’я пакета -python-dateutil
.