【问题标题】:Timezone in Django, DRF and PostgreSQL proper settingsDjango、DRF 和 PostgreSQL 中的时区正确设置
【发布时间】:2016-12-15 08:22:52
【问题描述】:

我在 Django 1.8 中配置了时区(我当前的时区是 UTC+1 或 BST):

TIME_ZONE = 'Europe/London'
USE_I18N = True
USE_L10N = True
USE_TZ = True

我的模型中有时间戳属性:

class NodeGPS(models.Model):
    node_id = models.ForeignKey(Node)
    timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)
    gps_latitude = models.FloatField(null=True, blank=True)
    gps_longitude = models.FloatField(null=True, blank=True)

我有 Django Rest Framework 3.4.0,所以当我通过 DRF Web 界面发布数据时,时间戳会自动设置为 UTC,这比我当前时间 (UTC+1) 早 1 小时。但是,在 PostgreSQL 中,时间戳字段设置为 UTC+1。但在 DRF Web 界面上,它总是以 UTC 显示时间。

多么奇怪的行为。 这是什么原因?

提前感谢您的任何建议!

【问题讨论】:

    标签: django timezone django-rest-framework


    【解决方案1】:

    这不再是问题,因为 django-rest-framework 3.7 及更高版本现在将显示带有服务器本地时区的序列化日期时间(由TIME_ZONE 设置)。这更符合 django 在模板和表单中转换为本地时区的行为。

    在 3.7 之前,日期时间不会在序列化程序中自动转换(因此通常是 UTC,除了在对象创建时,当它们是客户端上传的任何内容时)。假设任何使用 API 的人都将通过具有自己处理时区方式的客户端使用它,因此不一致的行为并不重要。

    如果您仍需要修复旧版本的 DRF,请创建一个可转换为正确时区的自定义日期时间字段。见这里:DjangoRestFramework ModelSerializer DateTimeField only converting to current timezone at object creation

    另外:注意 PostgreSQL 时间戳字段。它只是表明时间已转换为服务器认为它所在的时区,如(来自文档):

    所有可识别时区的日期和时间都以 UTC 格式在内部存储。在显示给客户端之前,它们会转换为 timezone 配置参数指定的区域中的本地时间。

    【讨论】:

      猜你喜欢
      • 2016-09-13
      • 2014-03-16
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 2020-10-17
      • 1970-01-01
      • 2012-01-16
      • 1970-01-01
      相关资源
      最近更新 更多