python - 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();
}
解决方案
TimeFields
没有时区。从文档中:
Django 仅支持简单的时间对象,如果您尝试保存感知时间对象,则会引发异常,因为没有关联日期的时间的时区没有意义。
如前所述,时间字段具有时区是没有意义的。没有日期的时间根据定义是日历(又名挂钟)时间,它们不会选择特定的时间。
实际上,您无法在不知道日期的情况下将时间转换为 UTC。那是因为转换取决于日期(想想夏令时)。
推荐阅读
- hana - 使用 SAP HANA CDS 文件时,STRING_AGG 不是可识别的内置函数名称
- javascript - 如何获取已动态给出 ID 的元素的 ID?
- c# - 检查重复
- python - 将纪元时间转换为本地时间
- python - 在 pyspark 中调整二项式 Logistic 回归参数;
- c# - 如何连接远程 RabbitMQ 服务器
- ios - Expo CLI 2.0 运行 ios 模拟器时出错
- java - 从 Pie 到 Nougat 和 Oreo 的兼容性问题
- java - java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“int com.xxHelper.SharedPref.GetInt(java.lang.String)”
- r - 为类别分配编号