【发布时间】:2013-10-30 14:26:12
【问题描述】:
对于我的大多数应用程序,使用 TIME_ZONE 和 USE_TZ 设置保存日期时间都很好。我的问题是,我怎样才能完成保存具有 UTC 日期时间的模型,但是设置了日期时间以便转换回用户输入的时区是正确的?下面给出了模型、视图、表单和 html。如果 USE_TZ = False 在 settings.py 文件中,此代码将起作用,但我想为项目中的其他所有内容保留时区。
型号:
class TZTestModel(models.Model):
timezone = TimeZoneField()
dt = models.DateTimeField()
查看:
class TZTestView(LoginRequiredMixin, TemplateView):
template_name = "tz_test.html"
def get_context_data(self, **kwargs):
return {
'form': self.form
}
def dispatch(self, request, *args, **kwargs):
self.form = TZTestForm(self.request.POST or None)
return super(TZTestView, self).dispatch(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
if self.form.is_valid():
self.form.save()
return self.render_to_response(self.get_context_data())
表格:
class TZTestForm(forms.ModelForm):
class Meta:
model = TZTestModel
def clean(self):
timezone = self.cleaned_data['timezone']
dt = self.cleaned_data['dt']
dt = timezone.localize(dt)
self.cleaned_data['dt'] = pytz.UTC.normalize(dt.astimezone(pytz.UTC))
return self.cleaned_data
模板:
<html>
<body>
<form method="post">
{% csrf_token %}
{{ form }}
<input type="submit">
</form>
</body>
</html>
例子:
我希望能够输入“美国/阿拉斯加”的时区和今天 13:00 的日期时间,将其保存为 UTC 值,然后能够转换回“美国/阿拉斯加”并获得正确的值。
基本上我试图将一个模型的日期时间保存在与我的应用程序不同的时区,其中时区由用户以与指定日期时间相同的形式指定。
【问题讨论】:
-
你看过time zones吗?
-
kroolik,是的,我已经研究过时区并正在使用它们。例如,在我的 settings.py 文件中,我将 TIME_ZONE 设置为使用“太平洋/檀香山”,并且所有保存为 UTC 的日期都可以正常工作。我的问题不在于显示时区信息,而是使用与我的服务器不同的用户指定时区保存对象的日期时间。我希望 django 使用在同一模型上指定的时区保存对象的日期时间。我可以用我想要的时区替换 tzinfo,但这会导致结果不正确,因为在保存之前没有计算 DST。
-
在会话中保留用户的时区不够吗?或者您需要更精细的时区选择方式?
-
同样,这与用户时区无关。这是在模型上计算日期时间,其中模型还包含时区。日期时间需要独立于用户或 django 的时区设置来计算。
标签: python django datetime timezone pytz