def day_night_duration(
            self,
            daybreak: datetime.time = datetime.time(NORMAL_DAY_START_H),
            nightfall: datetime.time = datetime.time(NORMAL_DAY_END_H)) \
            -> Tuple[datetime.timedelta, datetime.timedelta]:
        """
        Returns a ``(day, night)`` tuple of ``datetime.timedelta`` objects
        giving the duration of this interval that falls into day and night
        respectively.
        """
        daytotal = datetime.timedelta()
        nighttotal = datetime.timedelta()
        startdate = self.start.date()
        enddate = self.end.date()
        ndays = (enddate - startdate).days + 1
        for i in range(ndays):
            date = startdate + datetime.timedelta(days=i)
            component = self.component_on_date(date)
            # ... an interval on a single day
            day = Interval.daytime(date, daybreak, nightfall)
            daypart = component.intersection(day)
            if daypart is not None:
                daytotal += daypart.duration()
                nighttotal += component.duration() - daypart.duration()
            else:
                nighttotal += component.duration()
        return daytotal, nighttotal