Zeiten vergleichen?

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Zeiten vergleichen?

Beitrag von Bauer321 »

also wenn ich zwei zeiten vergleiche wird nicht festgestellt das sie gleich sind woran liegt das?

zeitum := now;
lb_eventlog.items.add(timetostr(zeit));
lb_eventlog.items.add(timetostr(zeitum));
if zeitum = zeit then

das ist nen kleiner ausschnitt aus dem code, das mit dem eventlog ist nur für den test.
Beispiel(kann ich ja alles der list box entnehmen)
zeitum = 18:00:00
zeit = 18:00:00

aber es passiert nichts woran liegt das?
www.mcpatcher.net | www.hoeper.me

am2
Lazarusforum e. V.
Beiträge: 116
Registriert: Di 21. Dez 2010, 09:59
OS, Lazarus, FPC: Win (L 0.9.26 beta FPC 2.2.2)
CPU-Target: 32 Bit

Re: Zeiten vergleichen?

Beitrag von am2 »

Bauer321 hat geschrieben:also wenn ich zwei zeiten vergleiche wird nicht festgestellt das sie gleich sind woran liegt das?

zeitum := now;
lb_eventlog.items.add(timetostr(zeit));
lb_eventlog.items.add(timetostr(zeitum));
if zeitum = zeit then

das ist nen kleiner ausschnitt aus dem code, das mit dem eventlog ist nur für den test.
Beispiel(kann ich ja alles der list box entnehmen)
zeitum = 18:00:00
zeit = 18:00:00

aber es passiert nichts woran liegt das?
Und Du bist Dir sicher, dass die Zeiten identisch sind (auf die Millisekunde)?
Grundsätzlich ist es meines Wissens so, dass die Zeit intern als Gleitkommazahl gespeichert wird. Wenn Du eine beliebige Zahl in eine Gleitkommazahl umwandelst, dann mußt Du davon ausgehen, dass die Repräsentation dieser Zahl nicht exakt Deiner gewünschten Zahl ist. Das heißt, aus 0,5 wird vielleicht 0,49999999999999999999999271234 gemacht, was Dir wahrscheinlich auch überall als 0,5 erscheint. Wenn Du aber nun einen Vergleich machst, möglicherweise auch noch mit einem anderen Datentyp, in welchem 0,5 als 0,500000000000000000000000123 dargestellt wird, dann wird das System feststellen, dass die Werte sich unterscheiden.

Du hast also 2 Möglichkeiten: 1. Du wandelst in einen String und vergleichst diesen (Kann aber dazu führen, dass 18:00:00,001 und 17:59:59,999 dann unterschiedlich gehandhabt werden, oder Du machst es klassisch: If abs(Zeit1-Zeit2)<1/24/3600/2 then (also innerhalb einer halben Sekunde)
Zum Test wäre es mal interessant, was passiert, wenn Du direkt vor Deinem If eine Gleichheit erzwingst, also Zeit1=Zeit2 (Gleiche Datentypen vorausgesetzt) und anschaust, was dann passiert.

MmVisual
Beiträge: 1582
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: Zeiten vergleichen?

Beitrag von MmVisual »

Passen zu diesem Thema, die Zahl:

86400

ist enorm wichtig. Die muss so geläufig sein wie ein Tag hat 24 Stunden oder 1440 Minuten oder 86400 Sekunden.

1/86400 = eine Sekunde des Tages.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: Zeiten vergleichen?

Beitrag von Bauer321 »

hmm ok, das mit den ms kann sein aber also >= eingestzt habe gings auch nicht. ist das ienfach flasch oder wieso geht es dann nciht?
edit: oder kann man zeiten "runden"
www.mcpatcher.net | www.hoeper.me

MmVisual
Beiträge: 1582
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: Zeiten vergleichen?

Beitrag von MmVisual »

Ja, kann man.

Zeit := Round(Zeit * 86400) / 86400;
EleLa - Elektronik Lagerverwaltung - www.elela.de

am2
Lazarusforum e. V.
Beiträge: 116
Registriert: Di 21. Dez 2010, 09:59
OS, Lazarus, FPC: Win (L 0.9.26 beta FPC 2.2.2)
CPU-Target: 32 Bit

Re: Zeiten vergleichen?

Beitrag von am2 »

MmVisual hat geschrieben:Ja, kann man.

Zeit := Round(Zeit * 86400) / 86400;
Ja, aber das ändert doch am Problem nichts! Das gerundete Ergebnis ist intern auch wieder 1.000000000000000001345 oder so.

Versuch mal:

const Schwellwert=1/86400;

...
If abs(Zeit1-Zeit2) < Schwellwert then ...

baba
Beiträge: 265
Registriert: Mi 4. Apr 2007, 17:47

Re: Zeiten vergleichen?

Beitrag von baba »

The TDateTime type holds a date and time value.

It is stored as a Double variable, with the date as the integral part, and time as fractional part. The date is stored as the number of days since 30 Dec 1899. Quite why it is not 31 Dec is not clear. 01 Jan 1900 has a days value of 2.

Because TDateTime is actually a double, you can perform calculations on it as if it were a number. This is useful for calculations such as the difference between two dates.
Sieh dir einfach den Float-Wert an. Die Zeit steht nach dem Dezimalpunkt - Dein Vergleich ist nur der Vergleich zweier Dezimalzahlen, mehr nicht.

Baba.

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Zeiten vergleichen?

Beitrag von MAC »

Naja wenn

Code: Alles auswählen

if Round(Zeit * 86400) / 86400  = Round(Zeit2 * 86400) / 86400 then ....
icht klappt. machs einfach

Code: Alles auswählen

if Round(Zeit * 86400)  = Round(Zeit2 * 86400) then ....
Wohl gemerkt direkt , ohne zwischenspeichern in real.
Jetzt hast du, wie schon erwähnt wurde, um die Sekunde genau verglichen

Code: Alles auswählen

Signatur := nil;

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: Zeiten vergleichen?

Beitrag von carli »

Eleganter wäre folgende Lösung:

Code: Alles auswählen

zeit1:=irgendwas;
zeit2:=irgendwas;
zeitspanne:=1/24/60/60; // eine Sekunde darfs abweichen
if abs(zeit1 - zeit2) < zeitspanne then begin
 // hier der Code dann
end;
abs ist der Absolutbetrag, also der Abstand der zwei Zeiten

Antworten