Отрицательная разница во времени Python

#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