docs: def duration_outside_nwh(
              self,
              starttime: datetime.time = datetime.time(NORMAL_DAY_START_H),
              endtime: datetime.time = datetime.time(NORMAL_DAY_END_H),
              weekdays_only: bool = False,
              weekends_only: bool = False) -> datetime.timedelta:
          """
          Returns a duration (a ``datetime.timedelta`` object) representing the
          number of hours outside normal working hours.
  
          This is not simply a subset of :meth:`day_night_duration`, because
          weekends are treated differently (they are always out of hours).
  
          The options allow the calculation of components on weekdays or weekends
          only.
          """
          if weekdays_only and weekends_only:
              raise ValueError("Can't have weekdays_only and weekends_only")
          ooh = datetime.timedelta()  # ooh = out of (normal) hours
          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
              if not is_normal_working_day(date):
                  if weekdays_only:
                      continue
                  ooh += component.duration()  # all is out-of-normal-hours
              else:
                  if weekends_only:
                      continue
                  normalday = Interval.daytime(date, starttime, endtime)
                  normalpart = component.intersection(normalday)
                  if normalpart is not None:
                      ooh += component.duration() - normalpart.duration()
                  else:
                      ooh += component.duration()
          return ooh