AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi C++ DateTime in Delphi TDateTime umwandeln.
Thema durchsuchen
Ansicht
Themen-Optionen

C++ DateTime in Delphi TDateTime umwandeln.

Ein Thema von Andreas L. · begonnen am 6. Apr 2009 · letzter Beitrag vom 17. Apr 2009
Antwort Antwort
Seite 2 von 2     12   
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#11

Re: C++ DateTime in Delphi TDateTime umwandeln.

  Alt 17. Apr 2009, 02:16
Zitat von Andreas L.:
Ein Auszug aus dem MSDN:
Zitat:
Remarks

The DateTime value type represents dates and times with values ranging from 12:00:00 midnight, January 1, 0001 Anno Domini (Common Era) to 11:59:59 P.M., December 31, 9999 A.D. (C.E.)

Time values are measured in 100-nanosecond units called ticks, and a particular date is the number of ticks since 12:00 midnight, January 1, 1 A.D. (C.E.) in the GregorianCalendar calendar. For example, a ticks value of 31241376000000000L represents the date, Friday, January 01, 0100 12:00:00 midnight. A DateTime value is always expressed in the context of an explicit or default calendar.
Hi,

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
  Mit Zitat antworten Zitat
Benutzerbild von nicodex
nicodex

Registriert seit: 2. Jan 2008
Ort: Darmstadt
286 Beiträge
 
Delphi 2007 Professional
 
#12

Re: C++ DateTime in Delphi TDateTime umwandeln.

  Alt 17. Apr 2009, 10:29
Zitat von Andreas L.:
Zitat von Chemiker:
12879544607645573 = Datum/Zeit. Welches Datum/Uhrzeit soll dieser Wert repräsentieren?

Hast Du die passenden Werte von Datum/Uhrzeit?
Ja, es soll der Donnerstag, 19. Februar 2009 20:16:47 sein.
Nö, 19:16 (20:16 ist die lokale Zeit bei dir).

Zitat von Andreas L.:
OK, ich hab jetzt weitere Infos. Es scheint sich um das von Webkit verwendet Datumsformat zu handeln:
Zitat:
WEBKIT time which is the number of microseconds since midnight UTC of 1 January 1601
Wie könnte ich das nun am besten umrechnen?
Windows verwendet ein ähnliches Zeitformat für TFileTime - nur in 100 Nanosekunden anstatt Mikrosekunden:
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;

procedure TestWebKitTimeToDateTime();
var
  DateTime: TDateTime;
begin
  if WebKitTimeToDateTime(StrToInt64('12879544607645573'), DateTime) then
    ShowMessage(DateTimeToStr(DateTime));
end;
Für die Umrechnung in eine lokale Zeit könnte man FileTimeToLocalFileTime verwenden.

Wie auch immer, man sollte beachten, dass TDateTime nicht alle Werte eines TFileTime/TWebKitTime abbilden kann (vor dem 30.12.1899).
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#13

Re: C++ DateTime in Delphi TDateTime umwandeln.

  Alt 17. Apr 2009, 11:20
Danke für die Antworten. Werde das gleich testen
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#14

Re: C++ DateTime in Delphi TDateTime umwandeln.

  Alt 17. Apr 2009, 12:22
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:
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;
Wenn ich jetzt 19.02.2009 19:02 umwandle erhalte ich -1456136888. Wo liegt der Fehler?
  Mit Zitat antworten Zitat
Benutzerbild von nicodex
nicodex

Registriert seit: 2. Jan 2008
Ort: Darmstadt
286 Beiträge
 
Delphi 2007 Professional
 
#15

Re: C++ DateTime in Delphi TDateTime umwandeln.

  Alt 17. Apr 2009, 13:27
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;
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#16

Re: C++ DateTime in Delphi TDateTime umwandeln.

  Alt 17. Apr 2009, 13:43
Ich bekomme als Ergebnis trotzdem -1456136888. Der Code meiner Test-App:
Delphi-Quellcode:
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;
Was mache ich falsch?
  Mit Zitat antworten Zitat
Benutzerbild von nicodex
nicodex

Registriert seit: 2. Jan 2008
Ort: Darmstadt
286 Beiträge
 
Delphi 2007 Professional
 
#17

Re: C++ DateTime in Delphi TDateTime umwandeln.

  Alt 17. Apr 2009, 14:01
Keine Ahnung, bei mir geht folgendes unter Delphi 2009:
Delphi-Quellcode:
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;
DateTimePicker1.Format ist 'yyyy-MM-dd HH:mm', dürfte aber keine Rolle spielen.
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#18

Re: C++ DateTime in Delphi TDateTime umwandeln.

  Alt 17. Apr 2009, 14:40
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.

  Edit1.Text := IntToStr(Int64(DateTimeToWebKitTime(DateTime))); Nochmal Danke für deine Hilfe
  Mit Zitat antworten Zitat
Benutzerbild von nicodex
nicodex

Registriert seit: 2. Jan 2008
Ort: Darmstadt
286 Beiträge
 
Delphi 2007 Professional
 
#19

Re: C++ DateTime in Delphi TDateTime umwandeln.

  Alt 17. Apr 2009, 14:42
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;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 12:33 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