![]() |
AW: Float in zwei Integer zerlegen
Ja ich merke gerade Indexierung nach TDateTime war keine gute Idee. Ich kann so zwar einen bestimmten Tag blitzartig finden (der Array ist sortiert), aber abspeichern des TDateTime in einen JSON mit FloatToStr() und das Parsen um es zu laden führt zur Verfälschung der Daten (zwar Unterhalb einer Sekunde, aber ich finde damit die Duplikate nicht mehr 100% zuverlässig). Vielleicht sollte ich Unixtime oder Filetime nehmen.
|
AW: Float in zwei Integer zerlegen
Zitat:
Ich hab schon zig Projekte geschrieben in deinen ich Daten miteinander verglichen oder gesucht habe. Das klappt schon, man muss sich nur der Problematik bewußt sein. Zitat:
|
AW: Float in zwei Integer zerlegen
Wer Fließkommazahlen auf exakte Gleichheit vergleicht, wird geteert und gefedert. Wie oft denn noch?
|
AW: Float in zwei Integer zerlegen
Zitat:
|
AW: Float in zwei Integer zerlegen
Also wenn die Zeit als Index dient und vor allem mit anderen Zeitwerten verglichen werden soll, ist ein TDateTime (=Double) so ziemlich die schlechtest mögliche Struktur die man wählen könnte. Die Gründe werden hier fast wöchentlich durchgekaut. Nimm einfach statt eines TDateTimes eien Cardinal, hau das Datum als Unix-Timestamp da rein, und fertig ist die Laube. Passt sogar in TListItem.Data. Ab 2038 wird man vermutlich aber mal einen Wartungslauf machen müssen, oder man nimmt einen Int64 und hat ein paar Jahrtausende Ruhe (muss dann aber auch wieder Pointer im ListItem hinterlegen).
Aber mit dem Float wirst du dir irgendwann gewaltig den Rücken brechen hier. |
AW: Float in zwei Integer zerlegen
Zitat:
Delphi-Quellcode:
procedure MM(s:string); begin Form1.Memo1.Lines.Add(s); end;
Function LDOUBLE(d:Double):INTEGER; begin Result:= TRUNC(d); //evtl. Zahl verschlüsseln end; Function RDOUBLE(d:Double):INTEGER; begin Result:= TRUNC(FRAC(d) * 24 * 60 * 60 * 1000); //evtl. Zahl verschlüsseln end; Function INTINTDOUBLE(a, b : INTEGER): DOUBLE; begin // evtl. Zahlen a und b vorher entschlüsseln Result:= a + (b / 24 / 60 / 60 / 1000); end; procedure TForm1.Button6Click(Sender: TObject); var a, b : INTEGER; begin MM(DATETIMETOSTR(now)); a:= LDOUBLE(now); b:= RDOUBLE(now); MM('LDOUBLE: '+INTTOSTR(a)); MM('RDOUBLE: '+INTTOSTR(b)); MM('Date: '+DATETOSTR(INTINTDOUBLE(a,b))); MM('Time: '+TIMETOSTR(INTINTDOUBLE(a,b))); MM('ReCombined: '+DATETIMETOSTR(INTINTDOUBLE(a,b))); end; |
AW: Float in zwei Integer zerlegen
Zitat:
Delphi-Quellcode:
Wir wollen ja keine Instanzen der Form verärgern.
procedure MM(s:string; AMemo: TMemo); begin AMemo.Lines.Add(s); end;
function LDOUBLE(d:Double):INTEGER; begin Result := TRUNC(d); end; function RDOUBLE(d:Double):INTEGER; begin Result := TRUNC(FRAC(d) * 24 * 60 * 60 * 1000); end; function INTINTDOUBLE(a, b : INTEGER): DOUBLE; begin Result := a + (b / 24 / 60 / 60 / 1000); end; procedure TForm1.Button6Click(Sender: TObject); var a, b : INTEGER; begin MM(DATETIMETOSTR(now),Self.Memo1); a := LDOUBLE(now); b := RDOUBLE(now); MM('LDOUBLE: '+INTTOSTR(a),Self.Memo1); MM('RDOUBLE: '+INTTOSTR(b),Self.Memo1); MM('Date: '+DATETOSTR(INTINTDOUBLE(a,b)),Self.Memo1); MM('Time: '+TIMETOSTR(INTINTDOUBLE(a,b)),Self.Memo1); MM('ReCombined: '+DATETIMETOSTR(INTINTDOUBLE(a,b)),Self.Memo1); end; |
AW: Float in zwei Integer zerlegen
Oder du benutzt:
Delphi-Quellcode:
um Delphi-Datum in ein Integer zu konvertieren.
function DateTimeToFileDate(DateTime: TDateTime): Integer;
//Delphi Datum (Double) in Betriebsystem Zeitstempel (Integer) Zurück geht es so:
Delphi-Quellcode:
Einschränkungen:
function FileDateToDateTime(FileDate: Integer): TDateTime;
//Betriebsystem Zeitstempel (Integer) in Delphi Datum (Double) Der Zeitstempel fängt 01.01.1980 an, Delphi-Datum dagegen 01.01.1900. Die Funktionen berücksichtigen das, so dass man nichts selbst dazurechnen oder abziehen muss, aber es sind keine Daten möglich die kleiner 1980 sind. Weitere Einschränkungen: es werden keine Millisekunden gesichert. Und zuallerletzt, ich habe das Gefühl, dass irgendwer hier pfuscht und nicht jede Sekunde gespeichert wird, sondern jede zweite Sekunde. Vielleicht weil man so ein Bit spart. |
AW: Float in zwei Integer zerlegen
Zitat:
:P |
AW: Float in zwei Integer zerlegen
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:37 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 by Thomas Breitkreuz