Как сложить datetime.time и datetime.timedelta

Рейтинг: 1Ответов: 1Опубликовано: 13.02.2023

Подскажите пожалуйста как решить проблему?

Функция генератор принимает два аргумента (кортежи с 3 целыми числами) и должна возвращать первичное время time_start и на каждой следующей итерации возвращать предыдущий результат +1 секунда. При этом час окончания может быть меньше от начального.

Функцию я сделал:

import datetime
from datetime import time


def time_range(time_start: tuple, time_end: tuple) -> tuple:
    start = time(time_start[0], time_start[1], time_start[2])
    end = time(time_end[0], time_end[1], time_end[2])
    step = datetime.timedelta(seconds=1)

    while start <= end:
        new_result = start + step
        yield new_result


t_range = time_range(time_start=(10, 0, 0), time_end=(10, 0, 3))
print(next(t_range))  # == (10, 0, 0)
print(next(t_range))  # == (10, 0, 1)
print(next(t_range))  # == (10, 0, 2)

Но есть две проблемы, которые не могу решить:

  1. Выдает ошибку и не складывает datetime.time и datetime.timedelta (в документации почитал, но так и не понял как можно решить эту проблему).
  2. Не могу сообразить как возвращать первичное время time_start, а уже после этого возвращать время + 1 секунда?

Ответы

▲ 2

по первому сделаем, как написано по ссылке

по второму вопросу: поменяйте местами yield и увеличение текущего времени

def time_range(time_start: tuple, time_end: tuple) -> tuple:
    start = time(time_start[0], time_start[1], time_start[2])
    end = time(time_end[0], time_end[1], time_end[2])
    step = datetime.timedelta(seconds=1)

    while start <= end:
        yield start
        start = (datetime.datetime.combine(datetime.date(1, 1, 1), start) + step).time()


t_range = time_range(time_start=(10, 0, 0), time_end=(10, 0, 3))
print(next(t_range))  # == (10, 0, 0)
print(next(t_range))  # == (10, 0, 1)
print(next(t_range))  # == (10, 0, 2)

выводит

10:00:00
10:00:01
10:00:02