AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein TDateTime kann nicht korrekt verglichen werden
Thema durchsuchen
Ansicht
Themen-Optionen

TDateTime kann nicht korrekt verglichen werden

Ein Thema von berens · begonnen am 14. Feb 2011 · letzter Beitrag vom 16. Feb 2011
Antwort Antwort
Seite 1 von 2  1 2      
berens

Registriert seit: 3. Sep 2004
434 Beiträge
 
Delphi 10.4 Sydney
 
#1

TDateTime kann nicht korrekt verglichen werden

  Alt 14. Feb 2011, 13:53
Hallo zusammen!

Nachdem ich schon wieder ernsthaft an mir selbst gezweifelt habe, bin ich doch langsam am Überlegen, ob das Folgende nicht vielleicht doch ein Delphi-Bug sein könnte:

Vorab: Ich lasse alle TDateTime-Werte * Sekunden pro Tag nehmen (nur den Nachkommateil natürlich), um die Anteiligen Sekunden zu ermitteln (gerundet) und teile dies dann wieder durch die Sekunden pro Tag. Das hat den Vorteil, dass ich diese TDateTime-Werte immer auf die volle Sekunde gerundet habe, damit ich beim Vergleichen keine Abweichungen oder Fehler durch z.B. Millisekunden habe.

Leider kommt es manchmal vor, dass Delphi irgendwie scheinbar zu ungenau Arbeitet.

Auf dem beigelegten Screenshot kann man folgendes sehen:

Wir befinden uns in einer meiner Prozeduren. (Die Variablen sind alle nur für diesen Screenshot erstellt, also bitte nicht wegen der Benennung meckern )

u.a.:
Delphi-Quellcode:
var
  dt: TDateTime;
  dtErsterDesMonats: TDateTime;
  a, b: TDateTime;
  e, f: string;
  t: string;
_NextFromDateTime ist ein TDateTime-Wert, welcher der Prozedur übergeben wird. Er soll im Laufe der Prozedur mit dt verglichen werden.

Am Haltepunkt auf dem Screenshot sehen wir in der Liste der überwachten Ausdrücke und lokalen Variablen, dass dt == _NextFromDateTime ist. Sowohl als Double, Float und String.

Lediglich die TDateTime-Werte unterscheiden sich scheinbar(!) da z.B. (a = b) und (dt = _NextFromDateTime) jeweils False ergibt. In der Auswertung werden TDateTime-Werte jedoch ausschließlich als String angezeigt (dd.mm.yyyy HH:nn), was sich auch beim Umschalten auf "Gleitkomma" o.ä. bei den überwachten Ausdrücken nicht ändert!

Tja, und nun?

1) Wie kann ich beim Debuggen sehen, welchen (Gleitkommawert) die beiden TDateTime-Variablen haben? Der Typcast als Float oder Double gibt beide ja als identisch aus?

2) Wie kann ich TDateTime-Werte möglichst einfach korrekt vergleichen
3) , so dass höchstens die Sekunden, nicht aber Millisekunden vergleichen werden?

Danke schonmal. :/
Miniaturansicht angehängter Grafiken
screenshot.png  
  Mit Zitat antworten Zitat
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#2

AW: TDateTime kann nicht korrekt verglichen werden

  Alt 14. Feb 2011, 14:15
Mal kurz drei Möglichkeiten:
  1. Decodiere das Datum (DecodeDateTime, Unit DateUtils) und vergleiche die einzelnen Teile miteinander.
  2. Wandle das Datum in einen Unix-Timestamp um (DateTimeToUnix, Unit DateUtils) und vergleiche diese. Sie sind nur Sekundengenau.
  3. Nutze die Funktion SameValue der Unit Math und passe den Parameter Epsilon entsprechend an.
Chris
Die Erfahrung ist ein strenger Schulmeister: Sie prüft uns, bevor sie uns lehrt.
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.416 Beiträge
 
Delphi XE5 Professional
 
#3

AW: TDateTime kann nicht korrekt verglichen werden

  Alt 14. Feb 2011, 14:16
Ich denke, dass es tatsächlich an den Rundungsdifferenzen liegen kann.
Schau mal in die Unit DateUtils.
Dort sind Vergleichsfunktionen für Datum drin.
Ich meine, dass die dort sogar, etwas Source gegen die Rundungsdiffs haben.

Im Zweifelsfall einfach dein Datum nehmen, mit Sekunden am Tag multiplizieren und mit trunc() in Integer wandeln und diesen vergleichen.
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#4

AW: TDateTime kann nicht korrekt verglichen werden

  Alt 14. Feb 2011, 14:18
Im Zweifelsfall einfach dein Datum nehmen, mit Sekunden am Tag multiplizieren und mit trunc() in Integer wandeln und diesen vergleichen.
Dann aber bitte Int64 - sonst wird das nix. (Ist aber dann fast das gleiche wie mein Vorschlag mit dem Unix-Timestamp.)
Chris
Die Erfahrung ist ein strenger Schulmeister: Sie prüft uns, bevor sie uns lehrt.
  Mit Zitat antworten Zitat
berens

Registriert seit: 3. Sep 2004
434 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: TDateTime kann nicht korrekt verglichen werden

  Alt 14. Feb 2011, 14:19
Das scheinen durchaus sinnvolle und umsetzbare Lösungansätze zu sein.
Vielen Dank!

Hat noch jemand eine Idee bzgl. der Anzeige in der Liste überwachter Ausdrücke?
  Mit Zitat antworten Zitat
Benutzerbild von mischerr
mischerr

Registriert seit: 6. Feb 2004
Ort: Konz
238 Beiträge
 
Delphi 12 Athens
 
#6

AW: TDateTime kann nicht korrekt verglichen werden

  Alt 14. Feb 2011, 14:24
Hallo

ich würde folgendes tun...

Zitat:
1) Wie kann ich beim Debuggen sehen, welchen (Gleitkommawert) die beiden TDateTime-Variablen haben? Der Typcast als Float oder Double gibt beide ja als identisch aus?
Code:
  OutputDebugString(pchar(FormatDateTime('dd.mm.yyyy hh:nn:ss.zzz', now)));
Zitat:
2) Wie kann ich TDateTime-Werte möglichst einfach korrekt vergleichen
3) , so dass höchstens die Sekunden, nicht aber Millisekunden vergleichen werden?
Code:
uses DateUtils;

if SecondsBetween(now, then)=0 then...
  Mit Zitat antworten Zitat
berens

Registriert seit: 3. Sep 2004
434 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: TDateTime kann nicht korrekt verglichen werden

  Alt 14. Feb 2011, 14:44
Zur Info:
Delphi-Quellcode:
    OutputDebugString(pchar(FormatDateTime('dd.mm.yyyy hh:nn:ss.zzz', a)));
    OutputDebugString(pchar(FormatDateTime('dd.mm.yyyy hh:nn:ss.zzz', b)));
    OutputDebugString(pchar(FormatDateTime('dd.mm.yyyy hh:nn:ss.zzz', dt)));
    OutputDebugString(pchar(FormatDateTime('dd.mm.yyyy hh:nn:ss.zzz', _NextFromDateTime)));
Liefert jeweils 100% identische Werte, obwohl -wie erwähnt- dies Werte unterschiedlich sind.

SecondsBetween scheint der allereinfachste Lösungsansatz zu sein. Danke
  Mit Zitat antworten Zitat
berens

Registriert seit: 3. Sep 2004
434 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: TDateTime kann nicht korrekt verglichen werden

  Alt 15. Feb 2011, 10:09
Thema vorläufig erledigt. Danke (Muss man Antworten, um "Offene Frage" herauszunehmen?)
  Mit Zitat antworten Zitat
berens

Registriert seit: 3. Sep 2004
434 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: TDateTime kann nicht korrekt verglichen werden

  Alt 16. Feb 2011, 10:21
Einen "Nachtrag" noch, da ich leider den letzten Eintrag nicht mehr bearbeiten kann:

Mir ist gerade ein uralter Trick eingefallen, mit dem ich vor langer Zeit schonmal ein änhliches Problem gelöst/umgangen habe:

NeuerDateTimeWert := StrToDateTime(DateTimeToStr(AlterDateTimeWert));

"Erschreckend" an der Sache ist, dass Delphi aus AlterDateTimeWert = 05.01.2011 10:52:11 --> NeuerDateTimeWert = 05.01.2011 10:52:10 macht. (Rundungsproblematik beachten! laut Überwachung lokaler Variablen)

Identisch ist natürlich in der Überwachung: DateTimeToStr(AlterDateTimeWert) = '05.01.2011 10:52:11' und StrToDateTime(DateTimeToStr(AlterDateTimeWert)) = 05.01.2011 10:52:10.

Somit scheint Delphi bei der Darstellung von "nicht runden" TDateTimeWerten in der überwachung lokaler Variablen und Liste überwachter Ausdrücke NICHT die Funktion DateTimeToStr() zu benutzen, sondern etwas selbstgebasteltet.

Finde ich persönlich für gescheites Debuggen sehr, sehr fragwürdig, denn man sollte schon erwarten können, dass der menschenlesbare Wert von TDateTime identisch ist mit DateTimeToStr() eben dieses Wertes...

Feedback dazu erwünscht, vielleicht mache ja ich was falsch. Ansonsten: sollte man das mal wirklich als Delphi-Bug posten?

Geändert von berens (16. Feb 2011 um 10:24 Uhr)
  Mit Zitat antworten Zitat
WM_CLOSE

Registriert seit: 12. Mai 2010
Ort: königsbronn
398 Beiträge
 
RAD-Studio 2009 Pro
 
#10

AW: TDateTime kann nicht korrekt verglichen werden

  Alt 16. Feb 2011, 10:42
Es ist doch dein Problem, dass du einen Floatwert direkt vergleicht. Man muss entweder Bereiche festlegen, oder das nach dem Komma abschneiden. Oder liefert dir SQRT(2) einen exakten Wert.
Das ist kein Delphi-Bug
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:00 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