Python Django и Datetime-осведомленные объекты
У меня есть модель Django, что некоторые model.DateTimeFields в качестве свойств. Поскольку пользователь должен был иметь возможность отдельно добавлять время и дату, и потому что я хотел иметь возможность полностью настраивать ввод даты и времени, которые отображаются в шаблоне, я сделал следующее
class Entry(models.Model):
title = models.CharField(max_length=40)
body = models.CharField(max_length=10000, blank=True)
created = models.DateTimeField(auto_now_add=True)
start_date = models.DateField(default=datetime.now().date())
start_hour = models.TimeField(default=datetime.now().time())
start = models.DateTimeField()
end_hour = models.TimeField(default=(datetime.now()+ timedelta(minutes=45)).time())
end = models.DateTimeField()
Форма
class EntryAddForm(ModelForm):
def __init__(self, *args, **kwargs):
super(EntryAddForm, self).__init__(*args, **kwargs)
self.fields['doctor'].queryset = Doctor.objects.all()
class Meta:
model = Entry
exclude = ('canceled','creator', 'reason','start', 'end')
widgets....#setting widgets here
def save(self, commit=True):
model = super(EntryAddForm, self).save(commit=False)
model.start = datetime.combine(self.cleaned_data['start_date'], self.cleaned_data['start_hour'])
model.end = datetime.combine(self.cleaned_data['start_date'], self.cleaned_data['end_hour'])
if commit:
model.save()
return model
Таким образом, в методе сохранения я создаю новый объект даты и времени с комбинацией даты начала и часа начала
Проблема в том, когда вы представляете их в форме для редактирования. Поскольку даты входа хранятся в utc, start_hour и end_hour не являются точным временем, когда я сохранил их из формы, но отстали на 3 часа (потому что я живу в Греции и у меня TIME_ZONE = Athens в моем файле настроек).
Есть ли действительно простой способ справиться с этой проблемой или решение не использовать осведомленные объекты?
И еще один маленький не по теме. Как Javascript знает смещение часового пояса. я делаю
x = new Date();
x.getTimeZoneOffset() / 60;
и я получаю -3, что правильно. Если я изменю свой часовой пояс в моей системе Ubuntu, мои часы Ubuntu изменятся, чтобы соответствовать времени выбранного часового пояса, но приведенный выше код JavaScript возвращает тот же результат. Так что JavaScript не будет использовать системный часовой пояс?
1 ответ
Он напрямую не решает проблему с часовым поясом, но вы не должны делать это в модели:
start_date = models.DateField(default=datetime.now().date())
start_hour = models.TimeField(default=datetime.now().time())
start = models.DateTimeField()
Вы загрязнили свою модель данных избыточными полями только для того, чтобы изменить пользовательский интерфейс - подходящее место для внесения этого изменения - в связанную ModelForm (и шаблоны)
Django предоставляет https://docs.djangoproject.com/en/dev/ref/forms/widgets/ именно для этой цели.
Для вас проблема часового пояса... если у вас есть USE_TZ = True
в настройках Django будет считать, что все даты и время, поступающие от пользователя, находятся в TIME_ZONE = 'Athens'
согласно вашим настройкам... он затем преобразует их в UTC перед сохранением в БД (и преобразует их обратно в афинское время при получении).
https://docs.djangoproject.com/en/dev/ref/settings/
Если вам нужно иметь дело с информацией о времени данных, представленной пользователями в различных часовых поясах, может быть проще установить USE_TZ = False
... у ваших дат больше не будет информации о часовом поясе, поэтому вы должны нормализовать все до UTC вне приложения Django (т.е. в javascript)
Я не уверен, что ответ на ваш вопрос о getTimeZoneOffset
- возможно, вам нужно перезапустить браузер, прежде чем он поймет изменение часового пояса системы?