code: public ChronoFunction<CalendarDate, Sunshine> sunshine(TZID tzid) {
  
          return date -> {
              PlainDate d = toGregorian(toLMT(date));
              Calculator c = this.getCalculator();
              double zenith = this.zenithAngle();
              Optional<Moment> start = c.sunrise(date, this.latitude, this.longitude, zenith);
              Optional<Moment> end = c.sunset(date, this.latitude, this.longitude, zenith);
              boolean absent = false;
              if (!start.isPresent() && !end.isPresent()) {
                  double elevation = this.getHighestElevationOfSun(d);
                  if (Double.compare(elevation, 90 - zenith) < 0) {
                      absent = true;
                  }
              }
              return new Sunshine(d, start, end, tzid, absent);
          };
  
      }
docs: /*[deutsch]
  <p>Fragt zu einem gegebenen Kalenderdatum die damit verbundenen Sonnenscheindaten ab. </p>
  
  <p>Der Zeitzonenparameter erm&ouml;glicht es, die Sonnenzeitdaten im Kontext einer eventuell
  ganz anderen Zeitzone zu beschreiben. Er dient jedoch nicht der Interpretation des Eingabedatums. </p>
  
  <p>Die Berechnung ist nur m&ouml;glich, wenn der zugrundeliegende Algorithmus das Merkmal der Sonnendeklination
  unterst&uuml;tzt, sonst wird eine {@code UnsupportedOperationException} geworfen. </p>
  
  @param   tzid    the identifier of the timezone any local times of the result refer to
  @return  function for obtaining sunshine data
  @since   3.34/4.29