code: public final void changeStartTime(LocalTime time, boolean keepDuration) {
          requireNonNull(time);
  
          Interval interval = getInterval();
  
          LocalDateTime newStartDateTime = getStartAsLocalDateTime().with(time);
          LocalDateTime endDateTime = getEndAsLocalDateTime();
  
          if (keepDuration) {
              endDateTime = newStartDateTime.plus(getDuration());
              setInterval(newStartDateTime, endDateTime);
          } else {
              /*
               * We might have a problem if the new start time is AFTER the current end time.
               */
              if (newStartDateTime.isAfter(endDateTime.minus(getMinimumDuration()))) {
                  interval = interval.withEndDateTime(newStartDateTime.plus(getMinimumDuration()));
              }
  
              setInterval(interval.withStartTime(time));
          }
      }
docs: Changes the start time of the entry interval.
  
  @param time         the new start time
  @param keepDuration if true then this method will also change the end time in such a way that the total duration
  of the entry will not change. If false then this method will ensure that the entry's interval
  stays valid, which means that the start time will be before the end time and that the
  duration of the entry will be at least the duration defined by the {@link #minimumDurationProperty()}.