#python #django
#python #django
Вопрос:
Я новичок в django. Я хочу рассчитать общее время. Моя модель подсчитывает разницу во времени — и сохраняет, представление подсчитывает сумму времени. Это работает. Но если разница во времени отрицательна(01:00 — 21:00), затем я получаю сообщение об ошибке (данные о времени ‘-1 день, 4:00:00’ не соответствуют формату ‘%H:% M:%S’). по идее, это должно быть 4:00 часов, я полагаю, что вам нужно экономить время не явно, но я не понимаю, как это сделать. Или вам нужно использовать что-то другое?
Models.py
class Trip(models.Model):
...
start_work = models.TimeField(verbose_name='Начало работы')
finish_work = models.TimeField(verbose_name='Окончание работы')
hours_worked = models.CharField(verbose_name='Отработано часов', max_length=50, blank=True)
...
@property
def hours_work(self):
result = datetime.combine(date.today(), self.finish_work) - datetime.combine(date.today(), self.start_work)
hours_work1 = str(result).rsplit(':', 1)[0]
hours_worked = hours_work1
return hours_worked
def save(self, *args, **kwargs, ):
self.hours_worked = self.hours_work
super(Trip, self).save(*args, **kwargs)
wiews.py
total_time = timedelta(hours=0, minutes=0)
me = trip.values_list('hours_worked')
sum_hour = 0
for el in me:
for i in el:
time = datetime.strptime(i, "%H:%M:%S")
t1 = timedelta(hours=time.hour, minutes=time.minute)
total_time = total_time t1
sum_hour = str(total_time).rsplit(':', 1)[0]
Ответ №1:
Если вы хотите вычислить общее количество часов в datetime.timedelta
объекте, что и получается при вычислении разницы между datetime.datetime
объектами, вы можете использовать total_seconds
:
td = datetime.datetime.now() - datetime.datetime(2021, 2, 15)
total_hrs = td.total_seconds() // 3600
Я не понимаю, почему вы не можете сделать это напрямую self.finish_work - self.start_work
? А также как это может быть отрицательным числом? Вы не можете закончить работу за один день до начала, поэтому я предполагаю, что в вашем коде есть проблема. Вероятно, в том datetime.combine
случае, когда задание начинается в 16:00 в день X и заканчивается в 1:00 в день X 1. Для вашего кода даты начала и окончания будут одинаковыми, и изменится только час, что даст вам отрицательную разницу.
Комментарии:
1. непосредственно
self.finish_work - self.start_work
выдает ошибку неподдерживаемого типа (типов) операндов для -: ‘datetime.time’ и ‘datetime.time. Я использую только время, без даты. Здесь вы правы, если работа началась сегодня в 12:00 и закончится завтра в 13:30, то результат будет неправильным. По логике вещей, работа не может превышать более 24 часов, поэтому привязка к дате отсутствует.
Ответ №2:
Это оказалось решаемой задачей. Добавлено условие: if self.finish_work < self.start_work:
добавить 24 часа
def hours_work(self):
if self.finish_work < self.start_work:
time = datetime.combine(date.today(), self.finish_work) timedelta(hours=24)
result = time - datetime.combine(date.today(), self.start_work)
else:
result = datetime.combine(date.today(), self.finish_work) - datetime.combine(date.today(), self.start_work)
hours_work1 = str(result).rsplit(':', 1)[0]
hours_worked = hours_work1
return hours_worked