code: public final void changeStartDate(LocalDate date, boolean keepDuration) {
          requireNonNull(date);
  
          Interval interval = getInterval();
  
          LocalDateTime newStartDateTime = getStartAsLocalDateTime().with(date);
          LocalDateTime endDateTime = getEndAsLocalDateTime();
  
          if (keepDuration) {
              endDateTime = newStartDateTime.plus(getDuration());
              setInterval(newStartDateTime, endDateTime, getZoneId());
          } else {
  
              /*
               * We might have a problem if the new start time is AFTER the current end time.
               */
              if (newStartDateTime.isAfter(endDateTime)) {
                  interval = interval.withEndDateTime(newStartDateTime.plus(interval.getDuration()));
              }
  
              setInterval(interval.withStartDate(date));
          }
      }
docs: Changes the start date of the entry interval.
  
  @param date         the new start date
  @param keepDuration if true then this method will also change the end date and 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()}.