Zeiten vergleichen?
-
- 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?
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?
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
-
- 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?
Und Du bist Dir sicher, dass die Zeiten identisch sind (auf die Millisekunde)?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?
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.
-
- 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?
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.
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
-
- 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?
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"
edit: oder kann man zeiten "runden"
www.mcpatcher.net | www.hoeper.me
-
- 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?
Ja, kann man.
Zeit := Round(Zeit * 86400) / 86400;
Zeit := Round(Zeit * 86400) / 86400;
EleLa - Elektronik Lagerverwaltung - www.elela.de
-
- 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?
Ja, aber das ändert doch am Problem nichts! Das gerundete Ergebnis ist intern auch wieder 1.000000000000000001345 oder so.MmVisual hat geschrieben:Ja, kann man.
Zeit := Round(Zeit * 86400) / 86400;
Versuch mal:
const Schwellwert=1/86400;
...
If abs(Zeit1-Zeit2) < Schwellwert then ...
Re: Zeiten vergleichen?
Sieh dir einfach den Float-Wert an. Die Zeit steht nach dem Dezimalpunkt - Dein Vergleich ist nur der Vergleich zweier Dezimalzahlen, mehr nicht.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.
Baba.
-
- 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?
Naja wenn
icht klappt. machs einfach
Wohl gemerkt direkt , ohne zwischenspeichern in real.
Jetzt hast du, wie schon erwähnt wurde, um die Sekunde genau verglichen
Code: Alles auswählen
if Round(Zeit * 86400) / 86400 = Round(Zeit2 * 86400) / 86400 then ....
Code: Alles auswählen
if Round(Zeit * 86400) = Round(Zeit2 * 86400) then ....
Jetzt hast du, wie schon erwähnt wurde, um die Sekunde genau verglichen
Code: Alles auswählen
Signatur := nil;
-
- 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?
Eleganter wäre folgende Lösung:
abs ist der Absolutbetrag, also der Abstand der zwei Zeiten
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;