Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Delphi Vollständige Schaltjahresregeln - IsLeapYearAdv (https://www.delphipraxis.net/141554-vollstaendige-schaltjahresregeln-isleapyearadv.html)

Wolfgang Mix 17. Jul 2009 09:47


Vollständige Schaltjahresregeln - IsLeapYearAdv
 
Die vollständig umgesetzten Schaltjahresregeln habe ich in der Code-Lib nicht gefunden.
Daher poste ich sie hier. Zum Exception-Handling hat sx2008 beigetragen.


Delphi-Quellcode:
//Wolfgang Mix, Delphi-PRAXiS
function IsLeapyearAdv(year:integer):boolean;
begin
  result:=false;
  case year of
      -4713..-1 :result:=(year+1) mod 4=0; // -45: Cäsars Reform
      1 .. 1582 :result:= year mod 4=0;
      1583..9999:result:=(year mod 4 =0) and ((year mod 100 <> 0)
                         or (year mod 400=0));
  else raise Exception.CreateFmt('IsLeapYear(%d) - invalid arg', [year]);
  end;
end;
Anmerkung: Die Schaltjahresermittlungen vor Chr. beziehen sich auf den von
Scaliger entwickelten Kalender und ist nur eine von vielen Möglichkeiten,
den Kalenderbereich zu erweitern. Für andere Definitionen ist der Code
entsprechend abzuändern.

[edit=fkerber]Für die Code-Lib aufbereitet. Mfg, fkerber[/edit]

TBx 11. Okt 2009 09:41

Re: Vollständige Schaltjahresregeln - IsLeapYear
 
Ich würde die Funktion anders benennen, da sie so den gleichen Namen trägt wie in der Unit SysUtils. Das kann leicht zu Verwechslungen führen.

DeddyH 11. Okt 2009 09:43

Re: Vollständige Schaltjahresregeln - IsLeapYear
 
ACK. Wie wäre es z.B. mit AdvIsLeapYear?

Wolfgang Mix 11. Okt 2009 09:57

Re: Vollständige Schaltjahresregeln - IsLeapYear
 
Habe die Funktion in Is_Leapyear umbenannt.

Gruß

Wolfgang

DeddyH 11. Okt 2009 09:59

Re: Vollständige Schaltjahresregeln - IsLeapYear
 
Nix für ungut, aber die Verwechslungsgefahr besteht weiterhin.

[edit] Weiterer Vorschlag: IsLeapYearEx [/edit]

toms 11. Okt 2009 10:31

Re: Vollständige Schaltjahresregeln - IsLeapYear
 
42 BC etc. waren ein Schaltjahre gem. dieser Seite, wird aber nicht als solches erkannt.

alzaimar 11. Okt 2009 10:35

Re: Vollständige Schaltjahresregeln - IsLeapYear
 
Einen kleinen Einwand bezüglich der '-4713' habe ich: Wieso sollte es vor Einführung des julianischen Kalenders 47 v.Chr. Schaltjahre geben, wo sie doch erst im Julianischen Kalender definiert wurden? Es kann doch nicht sein, das z.B. 199 v.Chr ein Schaltjahr ist, wenn es zu dem Zeitpunkt niemanden auf der Erde gab, der wusste, was ein Schaltjahr ist? Wofür soll das gut sein?

Und die Erweiterung auf Jahre vor der Einführung des Gregorianischen Kalenders im Oktober 1582 macht ja nur für Anwendungen Sinn, die sich mit historischen Daten beschäftigen.

Dann müsste man der Funktion jeodch noch die genaue Position mit geben, für die die Berechnung gelten soll. Denn der Gregorianische Kalender (die Sache mit dem "modulo 100") wurde zunächst nur in Spanien und Portugal im Oktober 1582 eingeführt. Viele Länder, darunter Deutschland (bzw. Teile davon), folgten zwar kurze Zeit später, aber andere, insbesondere der Balkan, die Sowjetunion sowie die Türkei übernahmen den Kalender, und damit die Berechnung der Schaltjahre, sogar erst im 20. Jahrhundert.

Die osteuropäsiche (genauer: Einflussbereich der Russisch-Orthodoxen Kirche) Version des Gregorianischen Kalenders benutzt zudem eine andere Formel zur Berechnung des Schaltjahres (die etwas genauer ist):
Delphi-Quellcode:
// Mark Sandy, Berlin/Ger.
function IsleapyearEasternOrthodox(year:integer):boolean;
begin
  result:=false;
  case year of
    -4713..-1 :
      result := (year+1) mod 4=0;
    1 .. 1582 :
      result := year mod 4=0;
    1924..9999: // Einführung des GC
      if year mod 4 = 0 then                  // Schaltjahr eventuell alle vier Jahre
        if (year mod 100 = 0) then            // Sonderfall: Jahrhunderte
          result := (year mod 9 in [2,6]) then // Nur, wenn bei Teilung durch 9 ein Rest von 2 oder 6 verbleibt
        else
          result := true                      // Alle anderen durch vier teilbaren Jahre
      else
        result := false;                      // Alle anderen *nicht* durch vier teilbaren Jahre

  else raise Exception.CreateFmt('IsLeapYear(%d) - invalid arg', [year]);
  end;
end;
Angewandt auf Deutschland ergibt sich eine weitere Komplikation, denn obwohl die katholischen Ländereien 1583 die neue Schaltjahresrechnung einführten, dauerte es bis ins Jahr 1700, bis auch die protestantischen Länder den neuen Kalender einführten. Der Code ist also z.B. für Hannover korrekt, für Berlin jedoch nicht, liefert also für Jahre zwischen 1583 und 1700 falsche Ergebnisse.

Weiterhin müsste man sämtliche Kalenderfunktionen anpassen, denn es fehlen z.T. einfach Tage, die durch die Einführung des Gregorianischen Kalenders zwangsweise wegfallen mussten. Der Folgetag des 2. September 1752 war in Deutschland der 3.9.1752, aber in England der 14.9.1752. Klar, der 2.9. war in England natürlich nicht am gleichen Tag, wie in Deutschland, weil in England am 2.9 noch der alte Kalender galt (der neue wurde erst 1753 eingeführt).

Beim Überschreiten einer Grenze machte man also i.d.R. einen Sprung in die Vergangenheit (vom Datum her) bzw. zurück in die Zukunft.

Auch wenn die in der Literatur einschlägig bekannten Konvertierungen von Julianischen zum Gregorianischen Kalender das Jahr 1583 als Basis ansehen (das Folgejahr auf die päbstliche Bulle, die den neuen Kalender als verbindlich vorsah), muss man doch bei Recherchen (z.B. Schriftsätzen), die das Datum beinhalten, sehr genau auf die Herkunkft achten.

Auch sind Funktionen zur Berechnung des Jahresanfangs abhängig, für welchen Ort dies gewünscht ist. Denn die Länder feierten den Jahresanfang unterschiedlich: am 1.Januar, 1.März, 25.März oder am 25. Dezember. So war in Amerika z.B. der Folgetag des 24.März 1721 der 25.März 1722, da bis zur Einführung des GC im Jahr 1732 Neujahr eben am 25. März gefeiert wurde.

Ich meine, eine pauschale Festsetzung der Umstellung von Julianischen auf den Gregorianischen Kalender ist einschlägig und (in meinen Augen) sinnlos. Erst eine detaillierte Betrachtung mit entsprechender Parametrierung (Ursprungsland) würde wirklich sinnvoll erscheinen und für historische Betrachtungen einen Mehrwert darstellen.
[edit]
Quellen:
Gen-Wiki
Dr.Dobbs Journal
[/edit]
Wie siehst Du das?

Wolfgang Mix 11. Okt 2009 11:08

Re: Vollständige Schaltjahresregeln - IsLeapYear
 
Meine Schaltjahresermittlungen im Zeitraum vor Chr. beziehen sich auf den von Scaliger entwickelten Kalender, Quelle z.B. hier

@Detlef
Könnte mich mit IsLeapyearAdv anfreunden ;-)

Gruß

Wolfgang

DeddyH 11. Okt 2009 11:21

Re: Vollständige Schaltjahresregeln - IsLeapYearAdv
 
Meinetwegen kann die auch IsLeapYearUnterBeruecksichtigungDerUmstellungVonJu lianischAufGregorianisch() heißen, solange man nicht Gefahr läuft, sie mit der Standard-IsLeapYear-Funktion zu verwechseln und man anhand der Bezeichnung in etwa erkennen kann, wo der Unterschied liegt :zwinker:

Wolfgang Mix 11. Okt 2009 11:29

Re: Vollständige Schaltjahresregeln - IsLeapYearAdv
 
Das wäre mir ein bißchen zu lang, außerdem bevorzuge ich englische Bezeichner :-D

Gruß

Wolfgang

DeddyH 11. Okt 2009 11:30

Re: Vollständige Schaltjahresregeln - IsLeapYearAdv
 
War ja auch nur ein Scherz :mrgreen:. Ein Ex oder Adv davor oder dahinter lässt zumindest erkennen, dass es sich um eine erweiterte Funktionalität handelt, von daher ist das schon OK IMHO.

alzaimar 11. Okt 2009 13:13

Re: Vollständige Schaltjahresregeln - IsLeapYear
 
Zitat:

Zitat von Wolfgang Mix
Meine Schaltjahresermittlungen im Zeitraum vor Chr. beziehen sich auf den von Scaliger entwickelten Kalender, Quelle z.B. hier

Das solltest Du mit angeben, denn die Berechnung ist nur eine Variante. Andere Quellen rechnen anders.

Schade, das Du ansonsten nicht auf meine Ausführungen eingehst, insbesondere auf den Sinn der erweiterten Schaltjahresberechnung sowie die Tatsache, das die Formel für Spanien korrekt ist, nicht jedoch für z.B. Berlin, Amerika oder Russland.

Wolfgang Mix 11. Okt 2009 13:31

Re: Vollständige Schaltjahresregeln - IsLeapYearAdv
 
@alzaimar

Ich habe Deinen Beitrag aufmerksam gelesen und finde ihn gut.
Ich würde In Post #1 mit einem Link auf diesen Beitrag zeigen.

Ich bitte Frederic, das in etwa so zu ändern:

Dies ist nur eine Variante der Schaltjahresermittlung.
Andere findet Ihr z.B. ---> hier (alzaimar/Post #7)

Gruß

Wolfgang

TBx 11. Okt 2009 13:36

Re: Vollständige Schaltjahresregeln - IsLeapYearAdv
 
Zitat:

Zitat von Wolfgang Mix
Ich bitte Frederic, das in etwa so zu ändern:

Machs doch einfach selber, Du kanst ddeinen Beitrag doch editieren <8wie Du selbst gerade erst bewiesen hast) ;-)

Wolfgang Mix 11. Okt 2009 13:43

Re: Vollständige Schaltjahresregeln - IsLeapYearAdv
 
Meinst Du, Post #7 an Post #1 anhängen?
Wird das nicht unübersichtlich?

Gruß

Wolfgang

TBx 11. Okt 2009 13:46

Re: Vollständige Schaltjahresregeln - IsLeapYearAdv
 
Nein, ich habe Dich so verstanden, dass Du Frederic bitten wolltest, auf den Beitrag von Alzimar zu verweisen.
Da wir das in deinem Beitrag machen würden, wäre es durchaus auch möglich, dass Du das selbst machst, wie es Dir beliebt.

Gruß

Thomas

Matze 11. Okt 2009 13:50

Re: Vollständige Schaltjahresregeln - IsLeapYearAdv
 
Zitat:

Zitat von Wolfgang Mix
Ich bitte Frederic, das in etwa so zu ändern:

Dies ist nur eine Variante der Schaltjahresermittlung.
Andere findet Ihr z.B. ---> hier (alzaimar/Post #7)

In die Code-Library kommt die beste Lösung. Wenn also dein Code von alzaimar ergänzt wurde und somit besser ist, landet der neue Code in der Code-Library. Die Code-Library ist ein Nachschlagewerk und dort suboptimale Lösungen hineinzustellen und auf bessere in der eigentlichen DP zu verlinken ergibt keinen Sinn.
Das Thema hier wird nach der endgültigen Übernahme in die Code-Library auch entfernt. Somit ist eine Verlinkung darauf nicht mehr möglich.

Ich hoffe, ich habe deine Aussage nicht falsch interpretiert. ;)

Grüße, Matze

alzaimar 11. Okt 2009 14:00

Re: Vollständige Schaltjahresregeln - IsLeapYearAdv
 
Zitat:

Zitat von Wolfgang Mix
Ich habe Deinen Beitrag aufmerksam gelesen...

Was ich mit meinen Überlegungen ausdrücken wollte, war die Unsicherheit über den Sinn der Festsetzung der Kalendergültigkeiten. Mir ist klar, das es Anwendungen im Bereich der archäologischen Astronomie (oder astronomischen Archäologie? :stupid: ) gibt, die eine kontinuierliche Zeitleiste benötigen, um z.B. die Bauten der Maya hinsichtlich ihrer Bedeutung und Verwendung zu begutachten (z.B. Winter/Sommersonnenwende, Vorhersage des Erntezeitpunktes etc.).

Wozu benötigt man also eine Schaltjahresberechnung für die Vergangenheit, wenn das doch nur für einen Teil der Länder und Epochen gilt? Es gibt irgendwelche Standards darüber, und Du hast zumindest die Schaltjahrberechnung vervollständigt und um eine Variante der Berechnung erweitert.

Du solltest in dem Fragment zumindest auf die Quellen eingehen und folgende Fragen beantworten:
1. Wieso gilt die Schaltjahresberechnung ab 4713 v.Chr, aber nicht im Jahr davor?
2. Wieso verwendest Du die Version von Joseph Justus Scaliger und nicht die von Julius Cäsar, der sich die Chose ausgedacht hat?

Wolfgang Mix 11. Okt 2009 14:03

Re: Vollständige Schaltjahresregeln - IsLeapYearAdv
 
@Matze

Mir geht es nicht um den besseren Code,
die orthodoxe Kirche interpretiert den Gregorianischen Kalender
halt anders als die westliche Welt.

Gruß

Wolfgang

Matze 11. Okt 2009 14:10

Re: Vollständige Schaltjahresregeln - IsLeapYearAdv
 
Ah, das meinst du.

Ich persönlich finde es auch nicht gut, wenn die Funktion so extrem verfeinert wird, dass die in die tiefste Vergangenheit reicht und auch noch die Länder als Parameter enthält. Das verwirrt nur und kaum einer weiß, wozu das gut sein soll.
So lange der gregorianische und der julianische Kalender unterstützt und somit auch negative Jahreszahlen ausgeschlossen werden (!) finde ich das eine schöne Lösung, die für fast alle Anwender ausreichen sollte. Für alle positiven Jahreszahlen ist der Code dann auch korrekt und ohne Einschränkungen gültig.
Da muss man natürlich schon abwägen, was sinnvoll ist und was nicht bzw. wie viele Leute was benötigen. Die Geschichtsforscher unter uns können sich den Code selbst erweitern.
Wenn wir mal ehrlich sind: Wer von den "normalen" Programmierern braucht schon Funktionen, die die Jahreszahlen v. Chr. berücksichtigen?

Alzaimar hat natürlich Recht, was die Logik in deinem Source anbelangt. Diese ist so eben nicht ganz korrekt. Daher hat er entsprechende Vorschläge gemacht. Ob er möchte, dass das so dann auch in der Code-Library steht, ist eine andere Sache. Ich danke weniger.
Also ich persönlich würde die negativen Jahreszahlen aus der "einfachen" Version, die die meisten verwenden werden, streichen. Oder eine separate Version für diese Jahreszahlen angeben, die auch dann gilt.

Grüße, Matze

Wolfgang Mix 11. Okt 2009 14:15

Re: Vollständige Schaltjahresregeln - IsLeapYearAdv
 
:-D

Daniel 11. Okt 2009 14:15

Re: Vollständige Schaltjahresregeln - IsLeapYearAdv
 
Gut. Dann können wir das endlich mal abschließen.

Wolfgang Mix 11. Okt 2009 14:18

Re: Vollständige Schaltjahresregeln - IsLeapYearAdv
 
Danke, Daniel.

Habe Post #1 dementsprechend noch einmal abgeändert.

Gruß aus Lübeck

Wolfgang


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz