AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Datum/Zeitwerte vergleichen

Ein Thema von MicMic · begonnen am 12. Sep 2018 · letzter Beitrag vom 14. Sep 2018
Antwort Antwort
Seite 2 von 2     12
michaelg

Registriert seit: 20. Apr 2008
87 Beiträge
 
#11

AW: Datum/Zeitwerte vergleichen

  Alt 13. Sep 2018, 18:26
Ich hab hier auch noch eine Variante zum Konvertieren, die sieht ähnlich auch wie die von Kodezwerg:

Delphi-Quellcode:
  function FileTimeToDateTime(ft: FILETIME): TDateTime;
  var
    st: SYSTEMTIME;
    lt: FILETIME;
  begin
    FillChar(st, SizeOf(st), 0);
    FillChar(lt, SizeOf(lt), 0);
    FileTimeToLocalFileTime(ft, lt);
    FileTimeToSystemTime(lt, st);
    result := SystemTimeToDateTime(st);
  end;

  function DateTimeToFileTime(dt: TDateTime): FILETIME;
  var
    st: SYSTEMTIME;
    lt: FILETIME;
  begin
    FillChar(st, SizeOf(st), 0);
    FillChar(lt, SizeOf(lt), 0);
    FillChar(result, SizeOf(result), 0);
    DateTimeToSystemTime(dt, st);
    SystemTimeToFileTime(st, lt);
    LocalFileTimeToFileTime(lt, result);
  end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#12

AW: Datum/Zeitwerte vergleichen

  Alt 13. Sep 2018, 18:40
Bei Delphi-Referenz durchsuchenFindFirst oder Delphi-Referenz durchsuchenTDirectory.GetFiles(mit FilterPredicate) ist im TSearchRec bereits eine Konvertierung,
aber dort leider nur für LastWriteTime.

Im TDateTimeInfoRec des Delphi-Referenz durchsuchenFileGetDateTimeInfo war man so schlau das für alle 3 Datumswerte zu machen.

Leider ist die Konvertierungsfunktion intern versteckt und öffentlich nicht zugänglich (manchmal sind die Leute einfach nur saudämlich)
und zusätzlich hätte man auch gleich auf die Idee kommen können das Ganze als Helper an TFileTime zu hängen oder direkt in den TFileTime-Record einzubauen.

Oder vielleicht mal ein paar der Konvertierungsfunktionen als Helper an TDateTime.



Es gibt auch noch sowas wie Delphi-Referenz durchsuchenTTimeSpan, aber das kann praktisch nur mit Strings und TDateTime/TTimer/TDate umgehen, da ihm ansonsten einfach viele Import-/Exportfunktionen für andere bekanntere/gebräuchliche Typen fehlen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (13. Sep 2018 um 18:46 Uhr)
  Mit Zitat antworten Zitat
MicMic

Registriert seit: 26. Mai 2018
296 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#13

AW: Datum/Zeitwerte vergleichen

  Alt 13. Sep 2018, 19:22
Ich bin nun gerade dabei mit diesem TTime/TimeOf und TDate/DateOf

Da ich hier ja dann mit ...:
Code:
Var D1,D2 : TDate;

D1 := DateOf(FileTimeToDateTime(Datum1 aus FindData.ftCreationTime));
D2 := DateOf(FileTimeToDateTime(Datum2 aus FindData.ftCreationTime));

If D1 < D2 then ... // kleiner
else if D1 > D2 then ... // größer
else ... // gleich
... die Datumswerte vergleiche, habe ich mich gefragt ob ich dies auch so mit einem Datum+Uhrzeit machen kann. Ist ja alles Double. Gleich kam mir die Frage, wieso es dann überhaupt die Funktionen CompareDate/Time und CompareDateTime gibt. In der Hilfe unter "CompareDateTime" habe ich nun folgendes gelesen.
Zitat:
"Anmerkung: CompareDateTime unterscheidet sich vom direkten Vergleich der entsprechenden double-Genauigkeitswerte darin, dass die beiden TDateTime-Werte als gleich gelten, wenn sie bis zur Millisekunde demselben Zeitpunkt entsprechen. Es ist möglich, zwei TDateTime-Werte zu erstellen, die numerisch nicht identisch sind (als double-Werte), aber denselben Zeitpunkt repräsentieren (Jahr, Monat, Tag, Stunde, Minute, Sekunde und Millisekunde)."
Gleiches Datum+Uhrzeit aber unterschiedlicher double-Werte?
Na ich verstehe das mal jetzt gar nicht *lach
Ok, dann nimmt man für ein Vergleich zweiter Datum+Uhrzeit Werte dann die Funktion CompareDateTime.
Bin ja nicht abgeneigt auch Funktionen zu nutzen *lach

Soll ich dann lieber die obigen gespeicherten Werte in D1 und D2 dann lieber auch mit "CompareDate" vergleichen? Und das Ganze auch mit Time/TimeOf (hier dann CompareTime)?

Also mal zusammen:
Code:
 Var D1,D2 : TDate;
 Var T1,T2 : TTime;
 Var DT1,DT2 : TDateTime;
 D1 := DateOf(FileTimeToDateTime(Datum1 aus FindData.ftCreationTime));
 D2 := DateOf(FileTimeToDateTime(Datum2 aus FindData.ftCreationTime));
 T1 := TimeOf(FileTimeToDateTime(Datum1 aus FindData.ftCreationTime));
 T2 := TimeOf(FileTimeToDateTime(Datum2 aus FindData.ftCreationTime));
 DT1 := FileTimeToDateTime(Datum1 aus FindData.ftCreationTime);
 DT2 := FileTimeToDateTime(Datum2 aus FindData.ftCreationTime);
If D1<D2 usw. oder CompareDate(D1,D2) ?
If T1<T2 usw. oder CompareTime(T1,T2) ?
Wegen der Hilfe/Anmerkung bei DT1/DT2 lieber nur mit CompareDateTime(DT1,DT2) ?

Gruß
Michael
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#14

AW: Datum/Zeitwerte vergleichen

  Alt 13. Sep 2018, 20:29
https://www.swissdelphicenter.ch/de/...de.php?id=1103
Vielleicht hilft Dir dieses Beispiel weiter.
Delphi-Quellcode:
{
  This example shows how to use the TListView's CustomSort method to
  sort the items in the list using a ordering function.
  This allows you to sort custom data in the correct order you want.

  When the user clicks on a column header, the ListView will be sorted
  by that column.
  If the user clicks on the same column again, the sort order will be toggled.

  (***)

  Dieses Beispiel zeigt die Verwendung der CustomSort Methode einer TListView.
  Damit kann man z.B Zahlen korrekt (d.h nach ihrer Grösse) sortieren lassen.
  Wenn der Anwender auf den Kopf einer Spalte klickt, wird die ensprechende
  Spalte sortiert. Bei nochmaligem Klicken auf dieselbe Spalte wird die
  Sortierreihenfolge umgekehrt.

}


{ custom sort styles }

type
  TCustomSortStyle = (cssAlphaNum, cssNumeric, cssDateTime);

var
  { variable to hold the sort style }
  LvSortStyle: TCustomSortStyle;
  { array to hold the sort order }
  LvSortOrder: array[0..4] of Boolean; // High[LvSortOrder] = Number of Lv Columns

implementation

{$R *.DFM}

function CustomSortProc(Item1, Item2: TListItem; SortColumn: Integer): Integer; stdcall;
var
  s1, s2: string;
  i1, i2: Integer;
  r1, r2: Boolean;
  d1, d2: TDateTime;

  { Helper functions }

  function IsValidNumber(AString : string; var AInteger : Integer): Boolean;
  var
    Code: Integer;
  begin
    Val(AString, AInteger, Code);
    Result := (Code = 0);
  end;

  function IsValidDate(AString : string; var ADateTime : TDateTime): Boolean;
  begin
    Result := True;
    try
      ADateTime := StrToDateTime(AString);
    except
      ADateTime := 0;
      Result := False;
    end;
  end;

  function CompareDates(dt1, dt2: TDateTime): Integer;
  begin
    if (dt1 > dt2) then Result := 1
    else
      if (dt1 = dt2) then Result := 0
    else
      Result := -1;
  end;

  function CompareNumeric(AInt1, AInt2: Integer): Integer;
  begin
    if AInt1 > AInt2 then Result := 1
    else
      if AInt1 = AInt2 then Result := 0
    else
      Result := -1;
  end;

begin
  Result := 0;

  if (Item1 = nil) or (Item2 = nil) then Exit;

  case SortColumn of
    -1 :
    { Compare Captions }
    begin
      s1 := Item1.Caption;
      s2 := Item2.Caption;
    end;
    else
    { Compare Subitems }
    begin
      s1 := '';
      s2 := '';
      { Check Range }
      if (SortColumn < Item1.SubItems.Count) then
        s1 := Item1.SubItems[SortColumn];
      if (SortColumn < Item2.SubItems.Count) then
        s2 := Item2.SubItems[SortColumn]
    end;
  end;

  { Sort styles }

  case LvSortStyle of
    cssAlphaNum : Result := lstrcmp(PChar(s1), PChar(s2));
    cssNumeric : begin
                    r1 := IsValidNumber(s1, i1);
                    r2 := IsValidNumber(s2, i2);
                    Result := ord(r1 or r2);
                    if Result <> 0 then
                      Result := CompareNumeric(i2, i1);
                  end;
    cssDateTime : begin
                    r1 := IsValidDate(s1, d1);
                    r2 := IsValidDate(s2, d2);
                    Result := ord(r1 or r2);
                    if Result <> 0 then
                      Result := CompareDates(d1, d2);
                  end;
  end;

  { Sort direction }

  if LvSortOrder[SortColumn + 1] then
    Result := - Result;
end;


{ The ListView's OnColumnClick event }

procedure TForm1.ListView1ColumnClick(Sender: TObject; Column: TListColumn);
begin
  { determine the sort style }
  if Column.Index = 0 then
    LvSortStyle := cssAlphaNum
  else
    LvSortStyle := cssNumeric;

  { Call the CustomSort method }
  ListView1.CustomSort(@CustomSortProc, Column.Index -1);

  { Set the sort order for the column}
  LvSortOrder[Column.Index] := not LvSortOrder[Column.Index];
end;
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#15

AW: Datum/Zeitwerte vergleichen

  Alt 14. Sep 2018, 01:59
Immer wieder sieht man Codes, die noch niemand benutzt hat, der sein Programm auch mal debuggt,
mit massenhaft unnötigen Exceptions, welche ständig die Arbeit unterbrechen und jemanden zu einem Mord verleiten (an dem, der das verbrochen hat).

Delphi-Referenz durchsuchenTryStrToDateTime

Die uralte TurboPascal-Funktion "Val" ist hier nicht verkehrt, wobei es auch dafür seit Jahrzehnten ein Delphi-Referenz durchsuchenTryStrToInt gäbe.
Code ist allerdings irreführender Bezeichner, denn es ist ja eigentlich die Fehler-Position (ErrPos), aber da liegt der Fehler bei Delphi/Borland/Embaradero und dessen "falscher" Dokumentation/Funktionsdeklaration.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
MicMic

Registriert seit: 26. Mai 2018
296 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#16

AW: Datum/Zeitwerte vergleichen

  Alt 14. Sep 2018, 04:30
In der Funktion "CompareDates" wird genau das gemacht, was ich angesprochen habe, sprich laut Hilfe (diese eine Anmerkung) soll man die Vergleichsprüfung nicht so machen.
Trotzdem Danke @KodeZwerg für's raussuchen.

Michael
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 02:23 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