【问题标题】:Django Model's DateTimeField is taking UTC even when timezone is Asia/Calcutta everywhere即使时区是亚洲/加尔各答,Django 模型的 DateTimeField 也采用 UTC
【发布时间】:2018-08-31 16:14:16
【问题描述】:

我正在使用Django 1.11。 我的settings.py 有以下配置:

TIME_ZONE = 'Asia/Calcutta'
USE_I18N = True
USE_L10N = True
USE_TZ = True

这是 IST(印度标准时间)。我的系统设置为 IST。 MySQL current_time 返回 IST,Django 运行时的服务器,在 IST 中显示时间戳。 Python 的 datetime.now() 也提供 IST。

现在的问题是,我的models.py 有以下字段:

created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)

数据库是 MySQL。当我在其中插入任何记录时,时间戳为 UTC。正如this 回答所建议的那样,我正在考虑添加一些中间件,但这并不是推荐的方式。为什么即使在任何地方都配置了 IST 也需要 UTC?我是否缺少一些需要为模型单独设置的配置?

请注意 this question 与我的要求不同。我想更改整体时区,使其在模型中也有效。

【问题讨论】:

  • 试试 USE_TZ = True
  • 我已经设置了USE_TZ = True。这个percona.com/blog/2015/01/07/… 确实有效,但它又是一种中间件。我很想知道,当我在任何地方都设置了 IST 时,Model 仍然从​​哪里获取 UTC,并且我想更新那个确切的点,而不是每次都使用任何中间件。
  • @KevinChristopherHenry 谢谢,这就是我想要的。那么,如果我将其更改为False,它会正常工作吗?改成False后,是系统的时区还是设置中指定的时区?

标签: python mysql django datetime timezone


【解决方案1】:

如果USE_TZTrue,则datetimes 将是always be stored in UTC

解决此问题的唯一方法是将USE_TZ 设置为Falseauto_nowusesdjango.utils.timezone.now(),其中is defined to do如下:

如果USE_TZFalse,这将是一个简单的日期时间(即没有关联时区的日期时间),它表示系统本地时区中的当前时间。

这听起来像你要求的。

但是你确定这就是你想要的吗?由于Asia/Calcutta had DST in the past 有时您根本无法在数据库中明确表示。这就是为什么 UTC 是存储日期时间的标准选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-17
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 2021-10-21
    • 2018-01-11
    相关资源
    最近更新 更多