AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Neuen Beitrag zur Code-Library hinzufügen Delphi Vollständige Schaltjahresregeln - IsLeapYearAdv

Vollständige Schaltjahresregeln - IsLeapYearAdv

Ein Thema von Wolfgang Mix · begonnen am 17. Jul 2009 · letzter Beitrag vom 11. Okt 2009
Antwort Antwort
Seite 1 von 3  1 23   
Benutzerbild von Wolfgang Mix
Wolfgang Mix

Registriert seit: 13. Mai 2009
Ort: Lübeck
1.222 Beiträge
 
Delphi 2005 Personal
 
#1

Vollständige Schaltjahresregeln - IsLeapYearAdv

  Alt 17. Jul 2009, 10:47
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]
Wolfgang Mix
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.874 Beiträge
 
Delphi 12 Athens
 
#2

Re: Vollständige Schaltjahresregeln - IsLeapYear

  Alt 11. Okt 2009, 10:41
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.
Thomas Breitkreuz
Gruß Thomas
- Admin DelphiPRAXIS
- Admin Delphi-Treff
- Embarcadero MVP
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.534 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Vollständige Schaltjahresregeln - IsLeapYear

  Alt 11. Okt 2009, 10:43
ACK. Wie wäre es z.B. mit AdvIsLeapYear?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Wolfgang Mix
Wolfgang Mix

Registriert seit: 13. Mai 2009
Ort: Lübeck
1.222 Beiträge
 
Delphi 2005 Personal
 
#4

Re: Vollständige Schaltjahresregeln - IsLeapYear

  Alt 11. Okt 2009, 10:57
Habe die Funktion in Is_Leapyear umbenannt.

Gruß

Wolfgang
Wolfgang Mix
if you can't explain it simply you don't understand it well enough - A. Einstein
Mein Baby:http://www.epubli.de/shop/buch/Grund...41818516/52824
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.534 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Vollständige Schaltjahresregeln - IsLeapYear

  Alt 11. Okt 2009, 10:59
Nix für ungut, aber die Verwechslungsgefahr besteht weiterhin.

[edit] Weiterer Vorschlag: IsLeapYearEx [/edit]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#6

Re: Vollständige Schaltjahresregeln - IsLeapYear

  Alt 11. Okt 2009, 11:31
42 BC etc. waren ein Schaltjahre gem. dieser Seite, wird aber nicht als solches erkannt.
Thomas
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: Vollständige Schaltjahresregeln - IsLeapYear

  Alt 11. Okt 2009, 11:35
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?
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Wolfgang Mix
Wolfgang Mix

Registriert seit: 13. Mai 2009
Ort: Lübeck
1.222 Beiträge
 
Delphi 2005 Personal
 
#8

Re: Vollständige Schaltjahresregeln - IsLeapYear

  Alt 11. Okt 2009, 12:08
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
Wolfgang Mix
if you can't explain it simply you don't understand it well enough - A. Einstein
Mein Baby:http://www.epubli.de/shop/buch/Grund...41818516/52824
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.534 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: Vollständige Schaltjahresregeln - IsLeapYearAdv

  Alt 11. Okt 2009, 12:21
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
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Wolfgang Mix
Wolfgang Mix

Registriert seit: 13. Mai 2009
Ort: Lübeck
1.222 Beiträge
 
Delphi 2005 Personal
 
#10

Re: Vollständige Schaltjahresregeln - IsLeapYearAdv

  Alt 11. Okt 2009, 12:29
Das wäre mir ein bißchen zu lang, außerdem bevorzuge ich englische Bezeichner

Gruß

Wolfgang
Wolfgang Mix
if you can't explain it simply you don't understand it well enough - A. Einstein
Mein Baby:http://www.epubli.de/shop/buch/Grund...41818516/52824
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:49 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz