Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Prüfe Datum ob älter als ein Jahr (https://www.delphipraxis.net/137168-pruefe-datum-ob-aelter-als-ein-jahr.html)

LokutusvB 15. Jul 2009 14:23


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?

himitsu 15. Jul 2009 14:27

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)

LokutusvB 15. Jul 2009 14:32

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.

aaaaaaaaaa_10 15. Jul 2009 14:35

Re: Prüfe Datum ob älter als ein Jahr
 
Du wirst nicht drum rum kommen, Schaltjahrprüfungen durchzuführen, denke ich

Wolfgang Mix 15. Jul 2009 14:49

Re: Prüfe Datum ob älter als ein Jahr
 
Schau mal hier:
http://www.delphipraxis.net/internal...039188#1039188

LokutusvB 15. Jul 2009 15:02

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! :)

Wolfgang Mix 15. Jul 2009 15:08

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.

Reinhard Kern 15. Jul 2009 15:23

Re: Prüfe Datum ob älter als ein Jahr
 
Zitat:

Zitat von Wolfgang Mix
Gerne wieder,
hatte gehofft, der Mod würde den Code in der Code-Library ablegen.
Dann wäre er leichter zu finden.

Hallo,

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

HeikoAdams 15. Jul 2009 15:29

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.

Wolfgang Mix 15. Jul 2009 16:25

Re: Prüfe Datum ob älter als ein Jahr
 
[quote="Reinhard Kern"]
Zitat:

Zitat von Wolfgang Mix
Gerne wieder,
hatte gehofft, der Mod würde den Code in der Code-Library ablegen.
Dann wäre er leichter zu finden.

Hallo,

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

Reinhard Kern 15. Jul 2009 21:12

Re: Prüfe Datum ob älter als ein Jahr
 
Zitat:

Zitat von Wolfgang Mix
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

Ja, wenn es ums Jahr geht. Ich habe sowas benutzt für so schwierige Berechnungen wie 15 Tage Skonto, 30 Tage Zahlungsziel. Dabei kann mir auch Jungsteinzeit, Römisches Reich und Mittelalter egal sein.

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

Satty67 15. Jul 2009 21:31

Re: Prüfe Datum ob älter als ein Jahr
 
Zitat:

Zitat von Reinhard Kern
Ja, wenn es ums Jahr geht.

Post #1 lässt mich vermuten, genau darum geht es ;)

Die Methode von Wolfgang Mix ist ja auch schon von vor 1992 und zumindest was Schaltjahre angeht, angenehm resistent.

GreenHorn3600 15. Jul 2009 23:23

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

Stormy 16. Jul 2009 09:57

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

himitsu 16. Jul 2009 10:28

Re: Prüfe Datum ob älter als ein Jahr
 
Zitat:

Zitat von Stormy
wozu so eine Funktion wenn es Mod gibt?
Einfach den 4. Modulus des Jahres ausrechnen also zum Beispiel 1996 mod 4.

weil das nicht so einfach ist?

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: )

Stormy 16. Jul 2009 10:43

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

himitsu 16. Jul 2009 11:38

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:

Stormy 16. Jul 2009 11:44

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