如何处理Django中的时区更改?

时间:2019-02-06 15:46:59

标签: python django datetime timezone pytz

我有一个Django应用程序,其中PostgreSQL作为数据库,用于记录来自不同区域的用户的操作。最近,其中一个地区(俄罗斯伏尔加格勒)的时区永久地于2018年10月28日从UTC + 3h更改为UTC + 4h。

2019年1月,pytz在pypi中进行了更新,我更新了pytz依赖项,以便该区域收到正确的时区设置。

问题在于,2018年10月28日之前发生的事件现在与当前时区“不同步”。如果我正确理解,在pytz更新之后,Django现在会认为时区是并且始终是 UTC + 4h,因此2018年10月28日之前的事件会向前移动一小时。例如,它显示的是本地时间2pm,而不是1pm。

主要要求是用户应该能够在其本地时区看到正确的时间。例如,如果用户在2018年10月28日前后每天下午1点执行操作,则她应在所有事件中看到下午1点。即使10月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(),以使其采用例如日期并根据日期返回时区。也许有更聪明的方法可以做到这一点。

所以我的问题是,是否存在更好/更多的pythonic / Django处理时区变化的方式?由于时区会不时发生变化,所以我希望有比上述两个更好的选择。

0 个答案:

没有答案