Delphi-Version: 5
Date Vergleich
Hallo,
ich habe ein seltsames Problem. Ich vergleiche Dates miteinander und bekomme auf unterschiedlichen Systemen unterschiedliche Ergebnisse: Beispielsweise überprüfe ich ob ein Ereignis innerhalb eines Zeitraumes liegt. Mein Code:
Code:
Auf Maschine 1 funktioniert das korrekt.
...
var start: TDate; ende: TDate; ereignis: TDate; begin ... if (ereignis >= start) and (ereignis <= ende) then ... Auf Maschine 2 läuft er mir einen Tag zu spät in die Schleife, wenn start gleich ereignis ist. Wenn ich mit CompareDate arbeite läufts bei beiden Maschinen. Hat jemand eine Idee warum das so ist? Vielen Dank. Gruß mc |
AW: Date Vergleich
AFAIK enthalten auch TDate-Variablen einen Zeitanteil. Funktioniert es, wenn Du den jeweils mit DateOf nullst?
Delphi-Quellcode:
if (DateOf(ereignis) >= DateOf(start)) and
(DateOf(ereignis) <= DateOf(ende)) then |
AW: Date Vergleich
Stimmt, hab's eben ausprobiert: Mit DateOf(Datum) erfolgt die Berechnung korrekt. TDate ist tatsächlich vom Typ TDateTime, das wiederum vom Typ Double ist.
Delphi-Quellcode:
procedure TFormMain.Button1Click(Sender: TObject);
Var start, ende, ereignis : TDate; Aus : String; begin start := DateOf(StrToDate('01.03.2014')); ende := DateOf(StrToDate('30.04.2014')); ereignis := DateOf(DateTimePicker1.Date); if (ereignis >= start) and (ereignis <= ende) then Aus := 'innerhalb' else Aus := 'außerhalb'; ShowMessage(Aus); end; |
AW: Date Vergleich
Das ist nicht seltsam, sondern liegt in der Natur der Sache begründet.
TDate ist ein double und somit ein FloatingPoint-Type, und durch die systembedingten Ungenauigkeiten (nicht alle Werte können wirklich korrekt dargestellt werden) werden FloatingPoint-Werte immer auf Ähnlichkeit (mit einem Epsilon = maximale Abweichung) und nicht auf absolute Gleichheit geprüft. CompareDate berücksichtigt dieses eben ;) |
AW: Date Vergleich
Zitat:
|
AW: Date Vergleich
Zitat:
|
AW: Date Vergleich
Vielen Dank für eure Antworten.
ich dachte mir ursprünglich auch, dass es an einem Zeitanteil scheitern könnte, aber da der Typ ja nicht Datetime sondern Date ist, dachte ich der Zeitanteil wird dabei ignoriert. Alles klar, dann werde ich in Zukunft vergleiche mit CompareDate machen. |
AW: Date Vergleich
TDate und TTime haben grundsätzlich erstmal nur syntaktischen Charakter, also mehr für den Programmierer.
Intern sind TDateTime, TDate und TTime alle gleich (Double) und könnten sowohl Uhrzeit, als auch Datum enthalten. (wenn derjenige nicht aufpasst, welcher diese Typen/Variablen mit Werten füllt) |
AW: Date Vergleich
TDateTimePicker hat schon seit ewigen Zeiten einen Bug.
Wenn man das
Delphi-Quellcode:
abfragt würde man ja erwarten dass man nur den Datumsanteil bekommt.
Property [TDateTimePicker].Date
Schlieslich gibt es auch noch die Properties
Delphi-Quellcode:
und
DateTime
Delphi-Quellcode:
.
Time
Man bekommt aber das Datum + aktuelle Uhrzeit zurück. Abhilfe bringt die Zeile:
Delphi-Quellcode:
Die anderen DateOf() bei StrToDate() braucht man nicht.
ereignis := DateOf(DateTimePicker1.Date);
Möglicherweise hat man sich später nicht mehr getraut diesen Bug abzustellen weil dies existierenden Code brechen könnte... |
AW: Date Vergleich
Ich glaub den Bug hat man inzwischen sogar "schon" behoben. (in irgendeinem der XEs)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:55 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