code: public Duration plus(long amountToAdd, TemporalUnit unit) {
          Jdk8Methods.requireNonNull(unit, "unit");
          if (unit == DAYS) {
              return plus(Jdk8Methods.safeMultiply(amountToAdd, SECONDS_PER_DAY), 0);
          }
          if (unit.isDurationEstimated()) {
              throw new DateTimeException("Unit must not have an estimated duration");
          }
          if (amountToAdd == 0) {
              return this;
          }
          if (unit instanceof ChronoUnit) {
              switch ((ChronoUnit) unit) {
                  case NANOS: return plusNanos(amountToAdd);
                  case MICROS: return plusSeconds((amountToAdd / (1000000L * 1000)) * 1000).plusNanos((amountToAdd % (1000000L * 1000)) * 1000);
                  case MILLIS: return plusMillis(amountToAdd);
                  case SECONDS: return plusSeconds(amountToAdd);
              }
              return plusSeconds(Jdk8Methods.safeMultiply(unit.getDuration().seconds, amountToAdd));
          }
          Duration duration = unit.getDuration().multipliedBy(amountToAdd);
          return plusSeconds(duration.getSeconds()).plusNanos(duration.getNano());
      }
docs: Returns a copy of this duration with the specified duration added.
  <p>
  The duration amount is measured in terms of the specified unit.
  Only a subset of units are accepted by this method.
  The unit must either have an {@link TemporalUnit#isDurationEstimated() exact duration} or
  be {@link ChronoUnit#DAYS} which is treated as 24 hours. Other units throw an exception.
  <p>
  This instance is immutable and unaffected by this method call.
  
  @param amountToAdd  the amount of the period, measured in terms of the unit, positive or negative
  @param unit  the unit that the period is measured in, must have an exact duration, not null
  @return a {@code Duration} based on this duration with the specified duration added, not null
  @throws ArithmeticException if numeric overflow occurs