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 1 von 2  1 2      
Andreas L.
(Gast)

n/a Beiträge
 
#1

C++ DateTime in Delphi TDateTime umwandeln.

  Alt 6. Apr 2009, 19:28
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:
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.
http://msdn.microsoft.com/en-us/library/system.datetime(VS.71).aspx

TDateTime wird in der Delphi-Hilfe so beschrieben:
Zitat:
Der ganzzahlige Teil eines TDateTime-Wertes von Delphi entspricht der Anzahl der Tage seit dem 30.12.1899. Der fraktionale Teil des TDateTime-Wertes gibt die Tageszeit an.
Wie wandel ich das jetzt in einen TDateTime-Wert um?
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#2

Re: C++ DateTime in Delphi TDateTime umwandeln.

  Alt 7. Apr 2009, 15:18
Mein bisheriger Ansatz:
  • 12879544607645573 mit 100 multiplizieren um Nanosekunden zu erhalten = 1287954460764557300
  • Nanosekunden in Sekunden umrechnen = 1287954460.7645574 (gerundet = 1287954461)
  • Ausrechnen wie viele Sekunden zwischen dem 01.01.0001 und dem 01.01.1970 vergangen sind = 62135596800
    Delphi-Quellcode:
    var
      d: tDateTime;
    begin
      d := EncodeDateTime(0001, 01, 01, 00, 00, 00, 0000);
      i := DateTimeToUnix(d); //ist hier negativ
    end;

Und wie gehts weiter?

Hmm.. ein Mathe-Genie war ich noch nie. Stecke irgendwie fest...
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.859 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: C++ DateTime in Delphi TDateTime umwandeln.

  Alt 7. Apr 2009, 20:05
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
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#4

Re: C++ DateTime in Delphi TDateTime umwandeln.

  Alt 8. Apr 2009, 12:16
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.
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#5

Re: C++ DateTime in Delphi TDateTime umwandeln.

  Alt 15. Apr 2009, 16:18
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?

EDIT: Ich hab mir jetzt mal die UnixToDateTime-Routinen angesehen und ein bisschen gebastelt:

Delphi-Quellcode:
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;
Funktioniert leider nicht:
  DateTimePicker3.DateTime := WebKitTimeToDateTime(StrToInt64(Edit2.Text)); Wert von Edit2: 12884278663641352
Debugger zeigt als Ergebnis von WebKitTimeToDateTime: 149379631,64
DateTimePicker3 verändert sich aber nicht
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#6

Re: C++ DateTime in Delphi TDateTime umwandeln.

  Alt 16. Apr 2009, 16:21
Keiner eine Idee?
  Mit Zitat antworten Zitat
Reinhard Kern

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

Re: C++ DateTime in Delphi TDateTime umwandeln.

  Alt 16. Apr 2009, 16:31
Zitat von Andreas L.:
Keiner eine Idee?
Hi,

ohne garantiert korrekte Wertepaare, anhand derer man die Umwandlungssoftware prüfen könnte, lohnt sich das Nachdenken nicht wirklich.

Gruss Reinhard
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#8

Re: C++ DateTime in Delphi TDateTime umwandeln.

  Alt 16. Apr 2009, 19:12
Zitat von Reinhard Kern:
Zitat von Andreas L.:
Keiner eine Idee?
Hi,

ohne garantiert korrekte Wertepaare, anhand derer man die Umwandlungssoftware prüfen könnte, lohnt sich das Nachdenken nicht wirklich.

Gruss Reinhard
Ok, der Wert 12884375683494367 repräsentiert den 16. April 2009 19:14:45.

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...
  Mit Zitat antworten Zitat
Reinhard Kern

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

Re: C++ DateTime in Delphi TDateTime umwandeln.

  Alt 17. Apr 2009, 00:44
Zitat von Andreas L.:
Zitat von Reinhard Kern:
Zitat von Andreas L.:
Keiner eine Idee?
Hi,

ohne garantiert korrekte Wertepaare, anhand derer man die Umwandlungssoftware prüfen könnte, lohnt sich das Nachdenken nicht wirklich.

Gruss Reinhard
Ok, der Wert 12884375683494367 repräsentiert den 16. April 2009 19:14:45.

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...
Hi,

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
  Mit Zitat antworten Zitat
Reinhard Kern

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

Re: C++ DateTime in Delphi TDateTime umwandeln.

  Alt 17. Apr 2009, 02:05
Zitat von Reinhard Kern:
finally: DT := CT / 864000000000 + 25007,330053825741741
Hallo,

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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 01:20 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