首页 > 解决方案 > UTC 时间不节省

问题描述

我有一个带有 TimeField 的表单,它从动态创建的下拉列表中获取输入。我的所有其他表单都根据用户时区成功转换日期和时间,并将它们作为 UTC 保存在数据库中。我在这个特定表格上输入的时间似乎没有发生这种情况。我相信这是因为它从我拥有的列表中获取一个字符串值,但我不确定如何更改它,因为我的动态生成的输入列表的记录方式需要该列表。对于找到一种仍然动态生成我的时间下拉列表并将其保存为 UTC 的方法,我将不胜感激。

HTML

<div class="form-group">
    <label>Time</label>
    {{ form.booked_time }}
</div>

模型.py

class Booked(models.Model):
    booked_time = models.TimeField(null=True, blank=True)

表格.py

class BookedForm(forms.ModelForm):
    booked_time = forms.ChoiceField(choices=time_list, widget=forms.Select(attrs={'class' : 'form-control', 'id' : 'time', 'required' : 'True'}))
 'booked_time')

有一个类似这样的 time_list

('', 'Time'),
('8:00 am', '8:00 am'),
('8:15 am', '8:15 am'),
('8:30 am', '8:30 am'),

视图.py

def book_lesson(request, lesson_id):
    if request.user.is_authenticated and request.user.time_zone:
        activate(request.user.time_zone)
    else:
        deactivate()

    lesson = Lesson.objects.get(id=lesson_id)

    if request.method == 'POST':
        form = BookedForm(request.POST)

        if form.is_valid():
            book = form.save(commit=False)
            book.student_user = request.user
            book.teacher_user = lesson.user
            book.save()
            messages.success(request,'Lesson was successfully booked!')
            return redirect('/teacher/dashboard')

        else:
            form = BookedForm()

    form = BookedForm()
    context = {'form' : form, 'lesson' : lesson}
    return render(request, 'view/book_lesson.html', context)

JavaScript

var start = document.getElementById('start').innerHTML.split('.').join('').toLocaleLowerCase();
var end = document.getElementById('end').innerHTML.split('.').join('').toLocaleLowerCase();
var time = document.getElementById('time');

time.disabled = true;

var slotTimes = [];
document.getElementById("length").onchange = function (evt) {
    var timeDistance = evt.target.value;
    var startMoment = moment(start, "h:mm a");
    var endMoment = moment(end, "h:mm a");
    slotTimes = [];

    while (startMoment.isSameOrBefore(endMoment)) {
        slotTimes.push(startMoment.format("h:mm a"));
        startMoment = startMoment.add(timeDistance, 'minutes');
    }

    addDropdown();
    disabled();
};
function addDropdown() {
    var doc = '',
        times = slotTimes,
        i;
    for (i = 0; i < times.length; i++) {
        doc += "<option value='" + times[i] + "'>" + times[i] + "</option>";
    }

    document.getElementById('time').innerHTML = doc;
    disabled();
}

标签: pythondjangoformstime

解决方案


TimeFields没有时区。从文档中

Django 仅支持简单的时间对象,如果您尝试保存感知时间对象,则会引发异常,因为没有关联日期的时间的时区没有意义。

如前所述,时间字段具有时区是没有意义的。没有日期的时间根据定义是日历(又名挂钟)时间,它们不会选择特定的时间。

实际上,您无法在不知道日期的情况下将时间转换为 UTC。那是因为转换取决于日期(想想夏令时)。


推荐阅读