Django在定义的时区中保存DateTimeField

时间:2017-09-19 18:56:16

标签: django datetime timezone

这对我来说是一个非常令人费解的问题,经过几天的在线挖掘后,我一直无法找到任何解释如何实现这一目标的文档。希望这里有人可以解释一下!

我正在构建一个管理世界各地活动的应用程序。我想将事件的开始和结束时间存储在其特定区域设置的时区中,以便任何用户(无论其位置如何)都可以在该区域设置的特定时区中查看该事件何时发生。例如,美国/太平洋时区发生的事件将在美国太平洋时间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表单上,我输入:

  • 活动开始时间:2017-09-21 12:00:19
  • 活动结束:2017-09-21 13:00:19
  • 活动TZ :(格林威治标准时间-07:00)美国/太平洋地区

(见下文:) Create Event form

提交后,我看到我的日期返回为:

  • 活动开始时间:2017年9月21日 - 太平洋夏令时间上午5:00
  • 活动结束:2017年9月21日 - 太平洋时间上午6:00

(见下文:) Event view after creation

编辑2:

这是从shell中提取的数据。看来日期是以UTC时间保存的,忽略了时区字段。

Django shell event_start / event_end dates

0 个答案:

没有答案