Django — как посчитать количество часов, минут, секунд (TimeField)?

Все добра!

Есть модель:
class Blablabla(models.Model):
    start_t = models.TimeField(u"С", blank=True, null=True)
    end_t  = models.TimeField(u"По", blank=True, null=True)


Нужно посчитать количество часов, минут, секунд.

Может быть templatetag?
  • Вопрос задан
  • 3818 просмотров
Решения вопроса 1
aruseni
@aruseni
Если нужно универсальное решение для сравнения любых двух полей, содержащих время — тогда, вероятно, template tag будет вполне адекватным решением. Если же вам нужно сравнивать только два конкретных поля этой модели, вам будет намного проще добавить в модель соответствующие методы, и обращаться из шаблона к ним ({{ blablabla_obj.hours }}, {{ blablabla_obj.minutes }}, {{ blablabla_obj.seconds }}).

Впрочем, ваш вопрос составлен неточно. Вам нужно именно узнавать разницу между этими двумя значениями? В виде HH:MM:SS?

Update 1

Автор указал, что минуты и секунды вообще не указываются, и при этом end_t всегда больше, чем start_t. Таким образом, достаточно сравнить start_t.hour и end_t.hour.

Сделать это можно, добавив в модель соответствующий метод:

class Blablabla(models.Model):
    start_t = models.TimeField(u"From", blank=True, null=True)
    end_t  = models.TimeField(u"To", blank=True, null=True)

    def period_duration(self):
        """
        Returns the length of the period between
        start_t and end_t, in hours.

        This is precise as long as both values
        have 0 as minute/second.
        """
        return self.end_t.hour - self.start_t.hour

Далее, соответственно, если blablabla_obj — это объект модели Blablabla, то получить разницу между start_t и end_t можно с помощью blablabla_obj.period_duration() в коде или {{ blablabla_obj.period_duration }} в шаблоне.

Тест:

class BlablablaTestCase(TestCase):
    def setUp(self):
        start_t = datetime.time(14)
        end_t = datetime.time(18)
        self.blablabla_obj = Blablabla.objects.create(
            start_t=start_t,
            end_t=end_t
        )

    def test_period_calculation(self):
        """
        Tests that the period_duration method of the Blablabla
        model correctly compares start_t and end_t.
        """
        self.assertEqual(self.blablabla_obj.period_duration(), 4)

    def tearDown(self):
        self.blablabla_obj.delete()

Update 2

Если нужно считать и часы, и минуты, и секунды, то метод period_duration можно переписать вот так:

def period_duration(self):
    """
    Returns the length of the period between
    start_t and end_t, in the following format:

    HH:MM:SS
    """
    total_seconds = (
        (
            self.end_t.hour*3600
            +
            self.end_t.minute*60
            +
            self.end_t.second
        ) - (
            self.start_t.hour*3600
            +
            self.start_t.minute*60
            +
            self.start_t.second
        )
    )
    hour, total_seconds = divmod(total_seconds, 3600)
    minute, total_seconds = divmod(total_seconds, 60)
    second = total_seconds
    return "%02d:%02d:%02d" % (hour, minute, second)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы