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
Benutzerbild von KodeZwerg
KodeZwerg

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

AW: Datum/Zeitwerte vergleichen

  Alt 12. Sep 2018, 20:29
So hier in etwa könnte eine Konversion aussehen die himitsu beschreibt:
Delphi-Quellcode:
function FileTimeToDateTime(FileTime: TFileTime): TDateTime;
var
  LocalTime: TFileTime;
  DOSTime: Integer;
begin
  FileTimeToLocalFileTime(FileTime, LocalTime);
  FileTimeToDosDateTime(LocalTime, LongRec(DOSTime).Hi, LongRec(DOSTime).Lo);
  Result := FileDateToDateTime(DOSTime);
end;
oder so hier von den Schweizern
Delphi-Quellcode:
function FileTimeToDateTime(FileTime: TFileTime): TDateTime;
var
  ModifiedTime: TFileTime;
  SystemTime: TSystemTime;
begin
  Result := 0;
  if (FileTime.dwLowDateTime = 0) and (FileTime.dwHighDateTime = 0) then
    Exit;
  try
    FileTimeToLocalFileTime(FileTime, ModifiedTime);
    FileTimeToSystemTime(ModifiedTime, SystemTime);
    Result := SystemTimeToDateTime(SystemTime);
  except
    Result := Now; // Something to return in case of error
  end;
end;

function DateTimeToFileTime(FileTime: TDateTime): TFileTime;
var
  LocalFileTime, Ft: TFileTime;
  SystemTime: TSystemTime;
begin
  Result.dwLowDateTime := 0;
  Result.dwHighDateTime := 0;
  DateTimeToSystemTime(FileTime, SystemTime);
  SystemTimeToFileTime(SystemTime, LocalFileTime);
  LocalFileTimeToFileTime(LocalFileTime, Ft);
  Result := Ft;
end;
Gruß vom KodeZwerg

Geändert von KodeZwerg (12. Sep 2018 um 20:32 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Datum/Zeitwerte vergleichen

  Alt 12. Sep 2018, 21:23
Sorry, aber DosTime ... echt jetzt?
Der Typ ist so klein und veraltet, dass er nicht im geringsten an die Auflösung aller anderen genannten Typen ran kommt (Datenverlust), außerdem wird er seit jahrzehnten nirgendwo mehr verwendet.
Gut, die fehlenden Millisekunden kann man vielleicht noch verkraften, aber dieser Typ kennt auch keine ungeraden Sekunden.
Und dieser Typ kennt nur 128 Jahre (7 Bit), also von 1980 bis 2107 und dann ist Schluss.
OK, 90 Jahre sind noch lange hin, aber dennoch ma etwas an die Zukunft denken ... ich versuche auch gerade eben für jemanden ein uraltes Programm am Leben zu erhalten (vor fast 20 Jahren installiert, aber jetzt streikt langsam der PC und muß neu gemacht werden ... Firma weg, Entwickler tot, Nachfolger nicht erreichbar usw. ... Delphi 5 lebt ).

Wenn man etwas neues macht, dann gibt es keinen Grund veralte Dinge zu benutzen.
Und die Rechnenleisung und die Speichergrößen aller Rechner der letzen Jahrzehnte bieten mehr als genug Ressourcen, um mit Int64/Double arbeiten zu können.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
MicMic

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

AW: Datum/Zeitwerte vergleichen

  Alt 13. Sep 2018, 13:49
Ihr bringt mich ganz durcheinander

Also ich hole mir die Datums/Zeit Werte von TWIN32FindDataW und TWin32FindData.
Das ist ja dann _FILETIME 64 Bit. Wusste nicht, dass es ein altes DOS FILETIME gibt.

Bei den normalen Vergleichs-Funktionen ist mir nicht klar, was die genau machen wenn man nur nach Datum sucht (nicht nach Uhrzeit) oder nur nach Uhrzeit (nicht nach Datum). Deshalb dachte ich, meine Datumswerte speichere ich in String und wandle dies in YYYYMMDD (nur für ein Datum) um. Dann in eine Zahl konvertieren und dann ganz normal vergleichen (Wert1 < Wert2).

Aber was nun?

Ich hab jedenfalls ne Funktion (irgendwo aus dem Netz kopiert).
Code:
function FileTimeToDateTime(FileTime: TFileTime): TDateTime;
var
  ModifiedTime: TFileTime;
  SystemTime: TSystemTime;
begin
  Result := 0;
  if (FileTime.dwLowDateTime = 0) and (FileTime.dwHighDateTime = 0) then
    Exit;
  try
    FileTimeToLocalFileTime(FileTime, ModifiedTime);
    FileTimeToSystemTime(ModifiedTime, SystemTime);
    Result := SystemTimeToDateTime(SystemTime);
  except
    Result := Now; // Something to return in case of error
  end;
end;
Damit kann ich ja meine FILETIME ins Delphi TDateTime konvertieren. Wobei man übers "Result := Now;" sich noch mal Gedanken machen sollte. So ein Fallback (ich glaub das nennt man so) ist ja nicht immer gewünscht.
Mit FormatDateTime kann ich mir dann nur das Datum oder auch nur die Uhrzeit rauskopieren. An die Millisekunden komme ich auch ran. Zurückgeliefert bekomme ich dann hier auch ein String. Aber das soll ich ja nicht machen. Wie dann?

Mit einem TDateTime kann ich ja auch "*24*60*60*1000" rechnen

Also als Beispiel:
Code:
 If (trunc(FileTimeToDateTime(Datum1...FindData.ftCreationTime)*24*60*60*1000) <
 trunc(FileTimeToDateTime(Datum2...FindData.ftCreationTime)*24*60*60*1000)) then ...
Das wäre jedenfalls ein Vergleich mit Datum+Uhrzeit. Mir ist nicht ganz klar, wie ich das nur für ein Datum oder nur für eine Uhrzeit angeben muss.

Gruß
Michael
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Datum/Zeitwerte vergleichen

  Alt 13. Sep 2018, 14:23
Sorry, aber DosTime ... echt jetzt?
Ja um so hoch auflösenden Krams ging es hier glaube ich nicht, rein praktikabel.
Da mir bewusst war das es alt ist, hab ich doch von den Schweizern eine gängige standardmethode gepostet.

Ich hab jedenfalls ne Funktion (irgendwo aus dem Netz kopiert).
Oder aus meinem Beitrag oben hehe

Mit einem TDateTime kann ich ja auch "*24*60*60*1000" rechnen
Hilft Dir sowas bei Deinem Vorhaben?
Delphi-Quellcode:
uses DateUtils;

...

var
  Time: TTime;
  Date: TDate;

Time := TimeOf(EinDateTime);
Date := DateOf(EinDateTime);
edit
Ps:
SecondsBetween() kann Dir von Nutzen sein
DaysBetween() kann Dir von Nutzen sein
Gruß vom KodeZwerg

Geändert von KodeZwerg (13. Sep 2018 um 14:43 Uhr)
  Mit Zitat antworten Zitat
MicMic

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

AW: Datum/Zeitwerte vergleichen

  Alt 13. Sep 2018, 14:46
Mit einem TDateTime kann ich ja auch "*24*60*60*1000" rechnen
Hilft Dir sowas bei Deinem Vorhaben?
Delphi-Quellcode:
uses DateUtils;

...

var
  Time: TTime;
  Date: TDate;

Time := TimeOf(EinDateTime);
Date := DateOf(EinDateTime);
[/QUOTE]

Ich glaube ja... wohl so dann?
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
Zu TTime/TimeOf
Werden dort auch die Millisekunden berücksichtig?

Michael
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Datum/Zeitwerte vergleichen

  Alt 13. Sep 2018, 14:54
Zu TTime/TimeOf
Werden dort auch die Millisekunden berücksichtig?
Ja. TimeOf() setzt den internen Datewert dabei auf 0 (irgendwas mit 1899 oder so) und übrig bleibt nur der Zeitanteil.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
MicMic

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

AW: Datum/Zeitwerte vergleichen

  Alt 13. Sep 2018, 14:55
Ok, Danke für die Hilfe
Ich probiere es heut Abend dann mal aus.
Michael
  Mit Zitat antworten Zitat
michaelg

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

AW: Datum/Zeitwerte vergleichen

  Alt 13. Sep 2018, 17: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

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

AW: Datum/Zeitwerte vergleichen

  Alt 13. Sep 2018, 17: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.
Ein Therapeut entspricht 1024 Gigapeut.

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

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

AW: Datum/Zeitwerte vergleichen

  Alt 13. Sep 2018, 18: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
Antwort Antwort

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:39 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz