![]() |
Prüfe Datum ob älter als ein Jahr
Hallo Leute,
wie man die Differenz zweier Daten berechnen kann, darüber findet man viele Informationen im Netz. Aber vielleicht geht das ja auch total einfach ohne Schaltjahrberücksichtigung, Umrechnungen usw. . Ich habe ein gegebenes Datum und das aktuelle Datum. jetzt möchte ich einfach prüfen, ob das gegebene Datum älter als ein Jahr ist, genau ein Jahr oder eben noch nicht ein Jahr vergangen ist. Spontan fällt mir als einfachste Möglichkeit ein, Jahr, Monat und Tag zu vergleichen geht. Geht das auch anders und einfacher? |
Re: Prüfe Datum ob älter als ein Jahr
Also wenn du Schlatjahre nicht berücksichtigen willst, dann nimm das Datum als TDateTime und prüfe deren Differenz (Ganzzahlanteil = Tage)
|
Re: Prüfe Datum ob älter als ein Jahr
Eben wegen dieser Schaltjahrproblematik (man findet oft Berechnungen mit 365,25) ist mir pauschal nur die Lösung mit Vergleich Jahr, Monat und Tag eingefallen. Da das ganze für Garantiezwecke benötigt wird, müßte ich das Schaltjahr einbeziehen bzw. irgendwie umgehen können. Das habe ich im ersten Beitrag etwas unglücklich ausgedrückt.
|
Re: Prüfe Datum ob älter als ein Jahr
Du wirst nicht drum rum kommen, Schaltjahrprüfungen durchzuführen, denke ich
|
Re: Prüfe Datum ob älter als ein Jahr
|
Re: Prüfe Datum ob älter als ein Jahr
Danke Wolfgang Mix, die Berechnung ist super und einfach :). Ist die 4. Stelle eine 0, dann ist noch kein Jahr vergangen, ansonsten eben X Jahre. Ich hätte es etwas umständlicher vorgehabt und Tage, Monate und Jahre gesondert betrachtet.
Also nochmals Danke! :) |
Re: Prüfe Datum ob älter als ein Jahr
Gerne wieder,
hatte gehofft, der Mod würde den Code in der Code-Library ablegen. Dann wäre er leichter zu finden. |
Re: Prüfe Datum ob älter als ein Jahr
Zitat:
klar, was nicht VCL ist, ist hier unerwünscht. Ich benutze bisher für etwas allgemeinere Fälle die C-Funktion julian, die für Tag, Monat, Jahr einen Longint zurückliefert in Tagen unter Berücksichtigung von Schaltjahren. 2 mal angewendet und subtrahiert ergibt den Abstand in Tagen. Ich würde dann einfach 365 Tage Garantie geben, es ist doch sehr unwahrscheinlich, dass es gerade auf diesen einen Tag ankommt, und falls doch, wird sich der Kunde beschweren. Da das aber in C formuliert ist, kann es hier auch nicht veröffentlicht werden. Es gibt aber Leben ausserhalb Delphi. Gruss Reinhard |
Re: Prüfe Datum ob älter als ein Jahr
Schau mal in der Online Hilfe von Delphi unter YearsBetween bzw. YearSpan nach, ob Du damit ans Ziel kommst.
|
Re: Prüfe Datum ob älter als ein Jahr
[quote="Reinhard Kern"]
Zitat:
klar, was nicht VCL ist, ist hier unerwünscht. Ich benutze bisher für etwas allgemeinere Fälle die C-Funktion julian, die für Tag, Monat, Jahr einen Longint zurückliefert in Tagen unter Berücksichtigung von Schaltjahren. Code fuer den julianischen Tag sind mit Vorsicht zu geniessen. Man muss prüfen, ob der Ubergang vom 4.10.1582 auf 15.10.1582 korrekt behandelt wird. Bei durchgängiger Tageszählung gelten noch die älteren Schaltjahresregeln. Somit ist mein Code sicherer |
Re: Prüfe Datum ob älter als ein Jahr
Zitat:
Vor allem wollte ich drauf hinweisen, dass man Sachen wie Datumsberechnungen nicht ständig neu erfinden muss, das haben i.A. schon frühere Generationen gelöst. Irgendwo im Internet gibt es Algorithmen für fast jedes Kalendersystem, das die Menschheit erfunden hat, nötigenfalls auch vom jüdischen Kalender in den der Azteken. Gruss Reinhard |
Re: Prüfe Datum ob älter als ein Jahr
Zitat:
Die Methode von Wolfgang Mix ist ja auch schon von vor 1992 und zumindest was Schaltjahre angeht, angenehm resistent. |
Re: Prüfe Datum ob älter als ein Jahr
Hallo Jungs,
sagt mal, gibt es da nicht eine Funktion IsLeapYear oder so ähnlich, im Standard, welche angibt ob es sich um ein Schaltjahr handelt oder auch nicht? Grüße Euer GreenHorn |
Re: Prüfe Datum ob älter als ein Jahr
Hi,
wozu so eine Funktion wenn es Mod gibt? Einfach den 4. Modulus des Jahres ausrechnen also zum Beispiel 1996 mod 4. Wenn dann 0 raus kommt war wie in diesem Fall 1996 ein Schaltjahr. ... 1996 mod 4 = 0 <- Schaltjahr 1997 mod 4 = 1 1998 mod 4 = 2 1999 mod 4 = 3 2000 mod 4 = 0 <- Schaltjahr 2001 mod 4 = 1 ... Gruß Stormy |
Re: Prüfe Datum ob älter als ein Jahr
Zitat:
ein Erdenjahr ist nunmal nicht genau 365,25 Tage lang, (so war es noch im Julianischen Kalender) sondern, laut Definition des gregorianischen Kalenders (welchen wir aktuell nutzen) 365,2425 Tage. der Julianische Kalender ist mit 365,25 Tagen etwa 11 Minuten länger als das astromomische Jahr :angel: alle 100 Jahre (mod 100) ist es kein Schaltjahr ... also 1800 und 1900 waren Keine, aber da es alle 400 Jahre (mod 400) dennoch ein Schaltjahr ist, war das Jahr 2000 zufällig eines. und da es so immernoch nicht ganz mit dem astronomischen Erdenjahr übereinstimmt, schmuggeln die Herren der Zeit jedes Jahr mehrere Schaltminuten und Schaltsekunden in unserer Zeit rein. (also laschen ganze Minuten und Sekunden einfach weg oder lassen mal eine doppelt ablaufen, bei den Atomuhren und keiner merkt es :twisted: ) |
Re: Prüfe Datum ob älter als ein Jahr
Gut soweit vor oder zurück wollte ich nicht gehen.
Wers braucht muss das dann eben auch noch abfangen z.B. mit mod 400. ... 1600 mod 400 = 0 <- Schaltjahr 1700 mod 400 = 100 1800 mod 400 = 200 1900 mod 400 = 300 2000 mod 400 = 0 <- Schaltjahr 2100 mod 400 = 100 ... Aber danke für den Hinweis! Gruß Stormy |
Re: Prüfe Datum ob älter als ein Jahr
und genau das mach die Funktion isLeakYear aus der SysUtils :angel:
Delphi-Quellcode:
function IsLeapYear(Year: Word): Boolean;
begin Result := (Year mod 4 = 0) and ((Year mod 100 <> 0) or (Year mod 400 = 0)); end; wobei diese Funktion natürlich auch nur innerhalb des Zeitraumes des "aktuellen" gregorianischen Kalenders korrekt wäre ... also z.B. würde hier behauptet, daß des Jahr 100 nach Christi kein Schaltjahr wäre, was zwar stimmt, aber auch nur, weil es damals noch keine Schlatjahre gab. :lol: |
Re: Prüfe Datum ob älter als ein Jahr
Dachte mir schon das die Funktion es ähnlich macht aber habe sie dennoch nie benutzt.
Ist ja auch wie man sieht schnell selber geschrieben. :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:51 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 by Thomas Breitkreuz