У меня есть кодовая база, в которой эта ошибка может быть довольно часто: добавление timedelta к объекту datetime с учетом часового пояса может привести в объекте даты и времени, который имеет правильный часовой пояс и правильный момент времени, но неправильное смещение из-за летнего времени.
Я хотел бы изменить поведение datetime.__add__
. Я думал, что создаю подкласс datetime, а затем импортирую свой модифицированный подкласс, но из-за неизменности datetime это сложнее, чем я думал.
Вот что я пробовал:
#!/usr/bin/env python
import datetime as dt_orig
# 3rd party
import pytz
class datetime(dt_orig.datetime):
def __new__(cls, *args, **kwargs):
tzstring = None
if 'tzinfo' in kwargs and isinstance(kwargs['tzinfo'], str):
tzstring = kwargs['tzinfo']
kwargs['tzinfo'] = dt_orig.timezone.utc
dt_obj = super().__new__(cls, *args, **kwargs)
# if tzstring is not None: # When this is uncommented, it's not the custom datetime class but the standard Python class
# dt_obj = dt_obj.astimezone(pytz.timezone(tzstring))
return dt_obj
def __add__(self, other):
if isinstance(other, dt_orig.timedelta):
tmp = super().__add__(other) # creates a datetime.datetime
tmp = tmp.astimezone(pytz.utc).astimezone(tmp.tzinfo)
return tmp
else:
return super().__add__(other)
__radd__ = __add__
Таким образом, я могу создать собственный объект datetime, но когда я применяю obj.astimezone(...)
(или любой другой метод, например add), я получаю datetime.datetime
обратно.
Как я могу вернуть свой пользовательский объект datetime, сохраняя при этом реализацию datetime.datetime
в большинстве случаев?