我在Django 1.8中配置了时区(我当前的时区是UTC + 1或BST):
TIME_ZONE = 'Europe/London'
USE_I18N = True
USE_L10N = True
USE_TZ = True
我的模型中有timestamp属性:
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显示时间。
多么奇怪的行为。 这是什么原因?
提前感谢任何建议!
答案 0 :(得分:2)
虽然时间在模板和表单中转换为本地时区,但它们不会转换为序列化程序(因此除了创建对象时,它们通常是UTC,当它们是客户端上载的任何内容时)。假设使用API的任何人都将通过客户端以自己的方式处理时区。
解决方案是创建一个自定义日期时间字段,以转换为正确的时区。见这里:DjangoRestFramework ModelSerializer DateTimeField only converting to current timezone at object creation
另外:注意PostgreSQL时间戳字段。它只是表明时间已被转换为服务器认为的时区,如(来自文档):
所有时区感知日期和时间都以UTC格式存储在内部。在显示给客户端之前,它们将在timezone配置参数指定的区域中转换为本地时间。