C++ DateTime in Delphi TDateTime umwandeln.
Hi,
ich habe folgenden Wert aus einer Datei ausgelesen: 12879544607645573 Dieser Wert soll das Erstellungsdatum eines Eintrags der Datei darstellen. Ich vermute das es sich hier bei um einen DateTime-Wert handelt. Die Software mit der die Datei erstellt wurde, ist in C++ geschrieben. Ein Auszug aus dem MSDN: Zitat:
TDateTime wird in der Delphi-Hilfe so beschrieben: Zitat:
|
Re: C++ DateTime in Delphi TDateTime umwandeln.
Mein bisheriger Ansatz:
Und wie gehts weiter? Hmm.. ein Mathe-Genie war ich noch nie. Stecke irgendwie fest... |
Re: C++ DateTime in Delphi TDateTime umwandeln.
Hallo Andreas L.
12879544607645573 = Datum/Zeit. Welches Datum/Uhrzeit soll dieser Wert repräsentieren? Hast Du die passenden Werte von Datum/Uhrzeit? Bis bald Chemiker |
Re: C++ DateTime in Delphi TDateTime umwandeln.
Zitat:
|
Re: C++ DateTime in Delphi TDateTime umwandeln.
OK, ich hab jetzt weitere Infos. Es scheint sich um das von Webkit verwendet Datumsformat zu handeln:
Zitat:
EDIT: Ich hab mir jetzt mal die UnixToDateTime-Routinen angesehen und ein bisschen gebastelt:
Delphi-Quellcode:
Funktioniert leider nicht:
const
WebKitTimeDelta = 256036; //Tage zwischen 31.12.1899 und 01.01.1601 (glaube der Wert ist falsch) ... ... function DateTimeToWebKitTime(const AValue: TDateTime):Int64; begin Result := Round((AValue - WebKitTimeDelta) * MSecsPerDay); end; function WebKitTimeToDateTime(const AValue: Int64):TDateTime; begin Result := AValue / MSecsPerDay + WebKitTimeDelta; end;
Delphi-Quellcode:
Wert von Edit2: 12884278663641352
DateTimePicker3.DateTime := WebKitTimeToDateTime(StrToInt64(Edit2.Text));
Debugger zeigt als Ergebnis von WebKitTimeToDateTime: 149379631,64 DateTimePicker3 verändert sich aber nicht |
Re: C++ DateTime in Delphi TDateTime umwandeln.
Keiner eine Idee?
|
Re: C++ DateTime in Delphi TDateTime umwandeln.
Zitat:
ohne garantiert korrekte Wertepaare, anhand derer man die Umwandlungssoftware prüfen könnte, lohnt sich das Nachdenken nicht wirklich. Gruss Reinhard |
Re: C++ DateTime in Delphi TDateTime umwandeln.
Zitat:
EDIT: Die Werte werden vom Google Chrome Browser in der Cookies-Datei im UserData-Verzeichnis abgespeichert. Ich hab auch schon den Chromium Code geladen, finde aber die entsprechende Stelle im Code nicht. Ist auch ziemlich umfangreich... |
Re: C++ DateTime in Delphi TDateTime umwandeln.
Zitat:
braucht man alles nicht: gewünscht ist CppTime * mul + add = DelphiTime 1 Tag hat 864000000000 ticks (100ns), also (CppTime + 864000000000) * mul + add = DelphiTime + 1 -> das sind 2 Gleichungen mit 2 Unbekannten, daraus ergibt sich mul = 1/864000000000 und add = 25007,330053825741741 finally: DT := CT / 864000000000 + 25007,330053825741741 natürlich mit int64 und extended zu rechnen. Gruss Reinhard |
Re: C++ DateTime in Delphi TDateTime umwandeln.
Zitat:
hat mich nicht befriedigt - ist zwar mathematisch schon das, was du wolltest, aber eigentlich sollte add ganzzahlig sein (Tage). Eine genauere Zahlenanalyse ergab, dass Webtime ab 1601 richtig ist und dass UTC rauskommt - du hast aber in deinen Zahlenpaaren zuerst MEZ und dann MESZ angegeben. Korrekt logisch abgeleitet muss es daher heissen: DelphiTime := WebTime / 86400000000 {µs} - 109205 {Tage 1601 - 1899} + (MEZ - UTC | MESZ - UTC) {für GER} Gruss Reinhard |
Re: C++ DateTime in Delphi TDateTime umwandeln.
Zitat:
diese Definition ist schon reichlich abstrus, besonders das Beispiel mit dem 1.Jan 100 - da sind nämlich 24 Schalttage eingerechnet, aber ich weiss aus sicherer Quelle, dass es im ersten Jahrhundert keine Schaltjahre gab; von anderen Problemen wie der Umstellung vom julianischen auf den gregorianischen Kalender ganz abgesehen. Da wird mehr Verwirrung gestiftet als was erklärt. Gruss Reinhard |
Re: C++ DateTime in Delphi TDateTime umwandeln.
Zitat:
Zitat:
Delphi-Quellcode:
Für die Umrechnung in eine lokale Zeit könnte man FileTimeToLocalFileTime verwenden.
type
TWebKitTime = UInt64; function WebKitTimeToDateTime(const AWebKitTime: TWebKitTime; out ADateTime: TDateTime): Boolean; var SystemTime: TSystemTime; begin Result := FileTimeToSystemTime(TFileTime(AWebKitTime * 10), SystemTime); if Result then try ADateTime := SystemTimeToDateTime(SystemTime); except on E: EConvertError do Result := False; end; end; procedure TestWebKitTimeToDateTime(); var DateTime: TDateTime; begin if WebKitTimeToDateTime(StrToInt64('12879544607645573'), DateTime) then ShowMessage(DateTimeToStr(DateTime)); end; Wie auch immer, man sollte beachten, dass TDateTime nicht alle Werte eines TFileTime/TWebKitTime abbilden kann (vor dem 30.12.1899). |
Re: C++ DateTime in Delphi TDateTime umwandeln.
Danke für die Antworten. :-D Werde das gleich testen :thumb:
|
Re: C++ DateTime in Delphi TDateTime umwandeln.
Ok, der Code funktioniert wunderbar. Jetzt muss ich nur noch einen DateTime in einen WebKit-Time Wert umwandeln. Ich hab dazu die Routine umgedreht:
Delphi-Quellcode:
Wenn ich jetzt 19.02.2009 19:02 umwandle erhalte ich -1456136888. Wo liegt der Fehler?
function DateTimeToWebKitTime(const ADateTime: TDateTime;
out AWebkitTime: TWebKitTime): Boolean; var FileTime: TFileTime; begin FileTime := DateTimeToFileTime(ADateTime); if Result then try AWebkitTime := TWebKitTime(FileTime) div 10; except on E: EConvertError do Result := False; end; end; function DateTimeToFileTime(Value: TDateTime):TFileTime; var SystemTime: TSystemTime; begin DateTimeToSystemTime(Value, SystemTime); SystemTimeToFileTime(systemtime, Result); end; |
Re: C++ DateTime in Delphi TDateTime umwandeln.
Delphi-Quellcode:
type
TWebKitTime = UInt64; function WebKitTimeToDateTime(const AWebKitTime: TWebKitTime; out ADateTime: TDateTime): Boolean; var SystemTime: TSystemTime; begin Result := FileTimeToSystemTime(TFileTime(AWebKitTime * 10), SystemTime); if Result then try ADateTime := SystemTimeToDateTime(SystemTime); except on E: EConvertError do Result := False; end; end; function DateTimeToWebKitTime(const ADateTime: TDateTime): TWebKitTime; var SystemTime: TSystemTime; begin DateTimeToSystemTime(ADateTime, SystemTime); SystemTimeToFileTime(SystemTime, TFileTime(Result)); Result := Result div 10; end; procedure TestWebKitTime(); const WebKitTimeText = '12879544607645573'; var DateTime: TDateTime; begin if WebKitTimeToDateTime(StrToInt64(WebKitTimeText), DateTime) then ShowMessage( WebKitTimeText + #13#10 + FormatDateTime('yyyy-mm-dd hh:nn:ss,zzz', DateTime) + #13#10 + IntToStr(DateTimeToWebKitTime(DateTime))); end; |
Re: C++ DateTime in Delphi TDateTime umwandeln.
Ich bekomme als Ergebnis trotzdem -1456136888. Der Code meiner Test-App:
Delphi-Quellcode:
Was mache ich falsch?
procedure TForm4.Button1Click(Sender: TObject);
var datetime: TDateTime; begin WebKitTimetodatetime(StrToInt64(Edit1.Text), datetime); DateTimePicker1.DateTime := datetime; //in datettime umwandeln funktioniert end; procedure TForm4.Button2Click(Sender: TObject); var datetime: TDateTime; begin datetime := DateTimePicker1.DateTime; FormatDateTime('yyyy-mm-dd hh:nn:ss,zzz', DateTime); Edit1.Text := IntToStr(DateTimeToWebKitTime(DateTime)); end; |
Re: C++ DateTime in Delphi TDateTime umwandeln.
Keine Ahnung, bei mir geht folgendes unter Delphi 2009:
Delphi-Quellcode:
DateTimePicker1.Format ist 'yyyy-MM-dd HH:mm', dürfte aber keine Rolle spielen.
procedure TForm1.Button1Click(Sender: TObject);
resourcestring StrWebKitTimeConvertError = 'Failed to convert WebKitTime to DateTime.'; var DateTime: TDateTime; begin if WebKitTimeToDateTime(StrToInt64(Edit1.Text), DateTime) then DateTimePicker1.DateTime := DateTime else raise EConvertError.Create(StrWebKitTimeConvertError); end; procedure TForm1.Button2Click(Sender: TObject); var DateTime: TDateTime; begin DateTime := DateTimePicker1.DateTime; ShowMessage(FormatDateTime('yyyy-mm-dd hh:nn:ss,zzz', DateTime)); Edit1.Text := IntToStr(DateTimeToWebKitTime(DateTime)); end; |
Re: C++ DateTime in Delphi TDateTime umwandeln.
Tatsächlich. Laut Delphi-Hilfe existiert zwar eine überladene Routine von IntTostr die Int64 konvertiert, diese wird aber anscheinend nicht verwendet. Ich caste jetzt einfach noch nach Int64 und es geht.
Delphi-Quellcode:
Nochmal Danke für deine Hilfe :-D
Edit1.Text := IntToStr(Int64(DateTimeToWebKitTime(DateTime)));
|
Re: C++ DateTime in Delphi TDateTime umwandeln.
Ansonsten halt manuell:
Delphi-Quellcode:
function WebKitTimeToStr(AWebKitTime: TWebKitTime): string;
const MaxWebKitTimeStrLength = Length('18446744073709551615'); DecimalToCharacter: array [0..9] of Char = '0123456789'; var Index: Integer; begin SetLength(Result, MaxWebKitTimeStrLength); for Index := MaxWebKitTimeStrLength downto 1 do begin Result[Index] := DecimalToCharacter[AWebKitTime mod 10]; AWebKitTime := AWebKitTime div 10; if AWebKitTime = 0 then begin Delete(Result, 1, Index - 1); Break; end; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:32 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