Как бороться с изменениями часовых поясов в Джанго? - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть приложение Django с PostgreSQL в качестве базы данных, которая регистрирует действия пользователей из разных регионов.Недавно в одном из регионов (Волгоград, Россия) часовой пояс постоянно изменился с UTC + 3h на UTC + 4h 28 октября 2018 года.

В январе 2019 года pytz обновился вpypi и я обновили зависимость pytz, чтобы регион получил правильную настройку часового пояса.

Проблема в том, что события, произошедшие до 28 октября 2018 года, теперь не синхронизированы с текущим часовым поясом.Если я правильно понимаю, после обновления Pytz Django теперь считает, что часовой пояс и всегда был UTC + 4h, поэтому события до 28 октября 2018 года сдвинуты на один час вперед.Например, он показывает 14:00 по местному времени вместо 13:00.

Основное требование - пользователи должны иметь возможность видеть правильное время в своем местном часовом поясе.Например, если пользователь выполнял действие в 13:00 каждый день до и после 28 октября 2018 года, он должен видеть 13:00 для всех событий.Даже если события, произошедшие до 28 октября, теперь отличаются по времени UTC от событий, которые произошли после этой даты.В настоящее время даты и время событий отображаются с использованием метода модели:

class Event(models.Model):
    date_created = models.DateTimeField(auto_now_add=True, blank=False, null=False)
    organization = models.ForeignKey(Organization, blank=False, null=False)

    def date_created_local(self):
        return self.date_created.astimezone(self.organization.get_timezone()).isoformat()

Существует также другой потребитель данных, который в двух словах получает данные о событиях без какой-либо предварительной обработки.Было бы здорово, если бы он мог продолжать получать правильные данные в том же смысле, что и для пользователей.

Хотя в базе данных теперь есть правильные метки времени UTC (если я правильно понимаю), явероятно, необходимо выполнить одно из следующих изменений:

  1. Перезаписать записи в базе данных (сдвиг отметок времени на один час назад).Я считаю, что это может помочь удовлетворить оба требования, но я действительно сомневаюсь , что это хорошая идея переписать историю.
  2. Обновление Organization.get_timezone(), так что оно принимает, например, дату и возвращает часовой пояс на основе даты.Вероятно, есть более разумный способ сделать это.

Итак, мой вопрос: есть ли лучший / более питонический / Django способ справиться с изменением часовых поясов?Так как время от времени меняется часовой пояс, я надеюсь, что есть лучшие варианты, чем два выше.

...