我有一个Django应用程序(使用Postgres在Heroku上运行),其中包含一个包含DateTimeField()的简单表单:
class Response(models.Model):
'''
Model serves to record a users response to a given question on a given
questionnaire.
'''
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.PROTECT,
default=None,
db_index=True,
)
date = models.DateTimeField(
blank=False,
auto_now_add=True,
db_index=True,
help_text=(
"Date on which question was answered."
)
)
根据我的理解,我的date
字段应自动填入当前日期时间
对于DateTimeField:default = timezone.now - 来自django.utils.timezone.now()
- ref
此外,它应该是UTC时间戳
如果USE_TZ为True,则这将是一个表示UTC当前时间的有效日期时间。
- ref
我的settings.py有
TIME_ZONE = 'UTC'
USE_TZ = True
我有一些中间件将当前时区设置为CST:
from django.utils import timezone
import pytz
class TimezoneMiddleware(object):
def process_request(self, request):
if request.user.is_authenticated():
timezone.activate(pytz.timezone('America/Chicago'))
else:
timezone.deactivate()
我在表单提交[print(now(), localtime(now()), get_current_timezone())
]之前使用了一些调试打印语句,以验证now()
实际上是UTC。
当我提交表格时,我看到了:
2018-03-06T16:56:23.569311 + 00:00 app [web.1]:2018-03-06 16:56:23.569131 + 00:00 2018-03-06 10:56:23.569145-06: 00美国/芝加哥
但数据库存储2018-03-06 10:56:23
如何确保我提交的时间戳正确转换为UTC?
答案 0 :(得分:1)
但数据库存储
2018-03-06 10:56:23
我会更仔细地研究它;根据您获得该值的方式,它可能是也可能不是实际存储在数据库中的内容。数据库驱动程序(当然还有Django本身)可以在数据库的路上更改时区。如果它通过数据库驱动程序来检查该值的时区,您可能会发现毕竟没有问题。