这对我来说是一个非常令人费解的问题,经过几天的在线挖掘后,我一直无法找到任何解释如何实现这一目标的文档。希望这里有人可以解释一下!
我正在构建一个管理世界各地活动的应用程序。我想将事件的开始和结束时间存储在其特定区域设置的时区中,以便任何用户(无论其位置如何)都可以在该区域设置的特定时区中查看该事件何时发生。例如,美国/太平洋时区发生的事件将在美国太平洋时间9月19日下午2:30显示给用户
为了实现这一点,我正在捕获3个字段并存储它们。
我的模特:
from timezone_utils.fields import TimeZoneField
from timezone_utils.choices import PRETTY_COMMON_TIMEZONES_CHOICES
class Event(models.Model):
[...]
event_start = models.DateTimeField(blank=False, null=False)
event_end = models.DateTimeField(blank=False, null=False)
event_tz = TimeZoneField(choices=PRETTY_COMMON_TIMEZONES_CHOICES, default='US/Pacific')
我的表单:
from datetimewidget.widgets import DateTimeWidget
class EventForm(forms.ModelForm):
dateTimeOptions = {
'format': 'dd/mm/yyyy HH:ii P',
'autoclose': True,
'showMeridian' : True
}
event_start = forms.DateTimeField(widget=DateTimeWidget(options=dateTimeOptions, usel10n=True, bootstrap_version=3))
event_end = forms.DateTimeField(widget=DateTimeWidget(options=dateTimeOptions, usel10n=True, bootstrap_version=3))
class Meta:
model = Event
fields = ("name","description","registration_goal","registration_sla","registration_url","event_start","event_end","event_tz",)
我的观点:
class EventCreateView(CreateView):
form_class = EventForm
template_name = "events/event_create.html"
model = Event
def form_valid(self, form):
form_tz = pytz_timezone(str(form.cleaned_data['event_tz']))
timezone.activate(form_tz)
print("Before: {}".format(form.cleaned_data['event_start'])) # Before: 2017-09-20 18:00:41+00:00
form.cleaned_data['event_start'] = form_tz.localize(form.cleaned_data['event_start'].replace(tzinfo=None))
print("After: {}".format(form.cleaned_data['event_start'])) # After: 2017-09-20 18:00:41-04:00
form.cleaned_data['event_end'] = form_tz.localize(form.cleaned_data['event_end'].replace(tzinfo=None))
event = Event.objects.create(
name = form.cleaned_data['name'],
[...]
event_start = form.cleaned_data['event_start'],
event_end = form.cleaned_data['event_end'],
event_tz = form.cleaned_data['event_tz'],
)
print(event.event_start) # 2017-09-20 18:00:41-04:00
messages.success(self.request, "<strong>Success!</strong> Added new event {}".format(form.cleaned_data['name']))
return super().form_valid(form)
我的模板:
<p>
<strong>Event Start:</strong>
<span>{{ object.event_start | timezone:object.event_tz | date:'N j Y - g:i A e'}}</span>
</p>
<p>
<strong>Event End:</strong>
<span>{{ object.event_end | timezone:object.event_tz | date:'N j Y - g:i A e'}}</span>
</p>
它似乎正确捕获了Timezone,但显示的时间与我在控制台中打印()时间时显示的时间不同。益智游戏!
有什么想法吗?
修改 输入/输出上的一些额外细节/示例给我带来了麻烦。
在/ events / create表单上,我输入:
提交后,我看到我的日期返回为:
编辑2:
这是从shell中提取的数据。看来日期是以UTC时间保存的,忽略了时区字段。