Also mann kann das schon etwas einkürzen ohne die grundlegende Struktur zu verändern, wobei das in Einzelfällen auch von der eingesetzten Delphi-Version abhängt.
- Statt Real (deprecated) wird mit Double gearbeitet
- Die Funktion Tagnummer habe ich durch eine lokale Variable ersetzt. Das erspart die mehrfachen Aufrufe. (DayOfTheYear liefert bereits das gewünschte Ergebnis)
- Umrechnung Grad/Bogenmaß aus Unit System.Math
- Die Textkonstanten werden über ein Array anhand der eingestellten Sprache ausgewählt
- Zeiten werden über FormatDateTime formatiert
Delphi-Quellcode:
const
cMsgSelectTimeZone: array[Boolean] of string
= ('Bitte wählen Sie die Zeitzone für die Ausgabe der Sonnenzeiten aus.',
' Please, select the time zone for the suntimes.');
cFmtTime: array[Boolean] of string
= ('hh:nn "Uhr"', 'hh:nn am/pm');
const
h = -0.0145; // Korrekturfaktor für Lichtbeugung in Horzontnähe, entspricht -50 Bogenminuten
var
Laenge: Double; // Längengrad des Standorts, Bogenmaß
Breite: Double; // Breitengrad des Standorts, Bogenmaß
Deklination, Zeitdifferenz, Zeitgleichung: Double;
Woz_a: TTime; // wahre Ortszeit Sonnenaufgang
Woz_u: TTime; // wahre Ortszeit Sonnenuntergang
Moz_a: TTime; // mittlere Ortszeit Sonnenaufgang
Moz_u: TTime; // mittlere Ortszeit Sonnenuntergang
diff: Double;
tagNummer: Integer;
timeZoneOffset: Double;
begin
Laenge := DegToRad(StrToFloat(EdLaenge.Text)); // Umrechnung Längengrad in Bogenmaß
Breite := DegToRad(StrToFloat(EdBreite.Text)); // Umrechnung Breitengrad in Bogenmaß
tagNummer := DayOfTheYear(DateTimePicker.Date);
Deklination := 0.4095 * sin(0.016906 * (tagNummer - 80.086));
Zeitdifferenz := 12 * arccos((sin(h) - sin(Breite) * sin(Deklination)) /
(cos(Breite) * cos(Deklination))) / pi;
Zeitgleichung := -0.171 * sin(0.0337 * tagNummer + 0.465) - 0.1299 *
sin(0.01787 * tagNummer - 0.168);
Woz_a := 12 - Zeitdifferenz;
Woz_u := 12 + Zeitdifferenz;
if (RadioButtonMEZ.Checked) then // wenn MEZ ausgewählt ist
begin
timeZoneOffset := 1; // Hier auf Sommerzeit prüfen
end
else if (RadioButtonUTC.Checked) then // wenn UTC ausgewählt ist
begin
timeZoneOffset := StrToFloat(EdUTC.Text) - 1;
end
else // Fehlermeldung
begin
showmessage(cMsgSelectTimeZone[Sprache]);
Exit;
end;
diff := Zeitgleichung + ((15 - RadToDeg(Laenge)) * 4 / 60) + timeZoneOffset;
Moz_a := Woz_a - diff;
Moz_u := Woz_u - diff;
LabelAuf.Caption := FormatDateTime(cFmtTime[Sprache], Moz_a); // Ausgabe Aufgang
LabelUnter.Caption := FormatDateTime(cFmtTime[Sprache], Moz_u); // Ausgabe Untergang
end;