code: public static <T extends UnixTime> StartOfDay definedBy(ChronoFunction<CalendarDate, Optional<T>> event) {
  
          return new FunctionalStartOfDay<>(event);
  
      }
docs: /*[deutsch]
  <p>Liefert den Start eines Kalendertags, wie von der angegebenen Datumsfunktion bestimmt. </p>
  
  <p>Wenn die angegebene Funktion keinen Moment f&uuml;r ein Kalenderdatum ermitteln kann,
  wird eine Ausnahme geworfen. Diese Methode ist am besten f&uuml;r Kalender geeignet,
  deren Tage zu astronomischen Ereignissen wie einem Sonnenuntergang beginnen. Beispiel: </p>
  
  <pre>
  HijriCalendar hijri = HijriCalendar.ofUmalqura(1436, 10, 2);
  SolarTime mekkaTime = SolarTime.ofLocation(21.4225, 39.826111);
  ZonalOffset saudiArabia = ZonalOffset.ofHours(OffsetSign.AHEAD_OF_UTC, 3);
  StartOfDay startOfDay = StartOfDay.definedBy(mekkaTime.sunset());
  
  // short after sunset (2015-07-17T19:05:40)
  System.out.println(
  hijri.atTime(19, 6).at(saudiArabia, startOfDay)); // 2015-07-17T19:06+03:00
  
  // short before sunset (2015-07-17T19:05:40)
  System.out.println(
  hijri.minus(CalendarDays.ONE).atTime(19, 5).at(saudiArabia, startOfDay)); // 2015-07-17T19:05+03:00
  </pre>
  
  @param   <T> generic type parameter indicating the time of the event
  @param   event   function which yields the relevant moment for a given calendar day
  @return  start of day
  @since   3.34/4.29