I have provided a solution that does not handle time zones, since the problem is generating dates and times, and you can set the time zone later, but you want to.
You have a start date and a start and end time (for each day), plus an interval (in minutes) for these dates. The idea is to create a timedelta object representing the time interval and re-update the date-time until the end time is reached, then we advance one day and reset the time to the original and repeat.
A simple implementation could be:
def make_dates(start_date, number_of_days, start_time, end_time, interval, timezone): if isinstance(start_date, datetime.datetime): start_date = start_date.date() start_date = datetime.datetime.combine(start_date, start_time) cur_date = start_date num_days_passed = 0 step = datetime.timedelta(seconds=interval*60) while True: new_date = cur_date + step if new_date.time() > end_time: num_days_passed += 1 if num_days_passed > number_of_days: break new_date = start_date + datetime.timedelta(days=num_days_passed) ret_date, cur_date = cur_date, new_date yield ret_date In [31]: generator = make_dates(datetime.datetime.now(), 3, datetime.time(hour=17), datetime.time(hour=19), 15, None) In [32]: next(generator) Out[32]: datetime.datetime(2016, 9, 2, 17, 0) In [33]: next(generator) Out[33]: datetime.datetime(2016, 9, 2, 17, 15) In [34]: list(generator) Out[34]: [datetime.datetime(2016, 9, 2, 17, 30), datetime.datetime(2016, 9, 2, 17, 45), datetime.datetime(2016, 9, 2, 18, 0), datetime.datetime(2016, 9, 2, 18, 15), datetime.datetime(2016, 9, 2, 18, 30), datetime.datetime(2016, 9, 2, 18, 45), datetime.datetime(2016, 9, 2, 19, 0), datetime.datetime(2016, 9, 3, 17, 0), datetime.datetime(2016, 9, 3, 17, 15), datetime.datetime(2016, 9, 3, 17, 30), datetime.datetime(2016, 9, 3, 17, 45), datetime.datetime(2016, 9, 3, 18, 0), datetime.datetime(2016, 9, 3, 18, 15), datetime.datetime(2016, 9, 3, 18, 30), datetime.datetime(2016, 9, 3, 18, 45), datetime.datetime(2016, 9, 3, 19, 0), datetime.datetime(2016, 9, 4, 17, 0), datetime.datetime(2016, 9, 4, 17, 15), datetime.datetime(2016, 9, 4, 17, 30), datetime.datetime(2016, 9, 4, 17, 45), datetime.datetime(2016, 9, 4, 18, 0), datetime.datetime(2016, 9, 4, 18, 15), datetime.datetime(2016, 9, 4, 18, 30), datetime.datetime(2016, 9, 4, 18, 45), datetime.datetime(2016, 9, 4, 19, 0), datetime.datetime(2016, 9, 5, 17, 0), datetime.datetime(2016, 9, 5, 17, 15), datetime.datetime(2016, 9, 5, 17, 30), datetime.datetime(2016, 9, 5, 17, 45), datetime.datetime(2016, 9, 5, 18, 0), datetime.datetime(2016, 9, 5, 18, 15), datetime.datetime(2016, 9, 5, 18, 30), datetime.datetime(2016, 9, 5, 18, 45)]
Once you have the time, you can use the strftime method to convert them to strings.