![]() |
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 02:16 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