AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Konvertierung UnixTimeStamp nacht TDateTime und zurück
Thema durchsuchen
Ansicht
Themen-Optionen

Konvertierung UnixTimeStamp nacht TDateTime und zurück

Ein Thema von Ghostwalker · begonnen am 5. Jun 2018 · letzter Beitrag vom 7. Jun 2018
Antwort Antwort
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: Konvertierung UnixTimeStamp nacht TDateTime und zurück

  Alt 5. Jun 2018, 09:22
Da ich die Starter verwende hab ich keine .pas zu den Delphiegenen Units
Was ich oben schrieb war/ist Original Code von DateUtils.pas aus Delphi 2009.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
439 Beiträge
 
#2

AW: Konvertierung UnixTimeStamp nacht TDateTime und zurück

  Alt 5. Jun 2018, 09:27
Ja, das 1899-Problem habe ich nun auch erkannt. Das sollte schon mal besser sein:
Delphi-Quellcode:
function DatetimeToUnixTime(Datetime: TDatetime): Int64;
var
  t: TDatetime;
begin
  if Datetime<0
  then
    t := trunc(Datetime) - frac(Datetime) - UnixDateDelta
  else
    t := Datetime - UnixDateDelta;
  if t>0
  then
    Result := trunc(t*SecsPerDay + 0.5)
  else
    Result := trunc(t*SecsPerDay - 0.5);
end;
Für DateTimeToUnix habe ich noch keine kompakte Lösung.
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Konvertierung UnixTimeStamp nacht TDateTime und zurück

  Alt 5. Jun 2018, 09:57
Naja...DateTimeToUnix tut ja so:

Delphi-Quellcode:
var
  Zeit : int64;
  datum: int64;

begin
  zeit := Trunc((Abs(Frac(value))*cSecPerDay)+0.5); //Zeitanteil in Sekunden
  datum := trunc(int(value)*cSecPerDay); //Anzahl der Tage mit Bezug Delphi-Epoche in Sekunden
  result.fvalue := cDelphiEpocheUT+(datum+zeit);
end;
auch bei Daten vor 31.12.1899.

Nur die UnixTimeStamp nach TDateTime leidet hier unter dem 1899'er problem.

Ich probier grad, ob ich mit der Info von KodeZwerk hinsichtlich DateDelta was rauskrieg.
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.071 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Konvertierung UnixTimeStamp nacht TDateTime und zurück

  Alt 5. Jun 2018, 11:18
Ich verstehe das rumfummeln nicht.
Du hast zwar nicht die Quelltexte in der Starter, kannst doch aber trotzdem auf die Funktionen von System.DateUtils zugreifen?
Die Umwandlung davon sind doch richtig und korrekt?
Dieser NonRTL-Ansatz ist doch Käse.
Da müsstest du doch konsequenterweise auch auf System.Trunc verzichten.

Delphi-Quellcode:
program Project5;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  System.DateUtils;

procedure Main;
var
  DateTimeStr: string;
  TimeStr: string;
  MyTime: TTime;
  MyDate: TDate;
  MyDateTime: TDateTime;
  UnixTimeStamp: Int64;
begin
  DateTimeStr := '23.08.1733 18:33:44';
  Writeln('Testdatum: ', DateTimeStr);

  MyDateTime := StrToDateTime(DateTimeStr);
  Writeln('Umwandung in TDateTime: ', Double(MyDateTime).ToString);

  UnixTimeStamp := System.DateUtils.DateTimeToUnix(MyDateTime);
  Writeln('UnixTimeStamp: ', UnixTimeStamp.ToString);

  MyDateTime := System.DateUtils.UnixToDateTime(UnixTimeStamp);
  DateTimeStr := FormatDateTime('DD.MM.YYYY HH:MM:SS', MyDateTime);
  Writeln('Rückwandlung von Timestamp in TDateTime und in String: ', DateTimeStr);
  Trunc
end;


begin
  try
    Main;
    Readln;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
  Mit Zitat antworten Zitat
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
948 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: Konvertierung UnixTimeStamp nacht TDateTime und zurück

  Alt 5. Jun 2018, 14:15
@TiGU

ganz so einfach ist es nicht, wie schon in #4 vermeldet passen die Ergebnisse nicht.

Delphi-Quellcode:
program UT2;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  System.DateUtils;

const <- aus DateUtils Delphi 2009
  _UnixDateDelta = 25569;
  _SecsPerDay = 86400;

function _DateTimeToUnix(const AValue: TDateTime): Int64;
begin
  Result := Round((AValue - _UnixDateDelta) * _SecsPerDay);
end;

function _UnixToDateTime(const AValue: Int64): TDateTime;
begin
  Result := AValue / _SecsPerDay + _UnixDateDelta;
end;


procedure Main;
var
  DateTimeStr: string;
  MyDateTime: TDateTime;
  UnixTimeA,
  UnixTimeB : Int64;
begin
  DateTimeStr := '23.08.1733 18:33:44';
  Writeln('Testdatum: ', DateTimeStr);

  MyDateTime := StrToDateTime(DateTimeStr);
  Writeln('Umwandung in TDateTime: ', Double(MyDateTime).ToString);

  UnixTimeA := System.DateUtils.DateTimeToUnix(MyDateTime);
  Writeln('UnixTime(DateUtils - XE8 ): ', UnixTimeA.ToString);

  UnixTimeB := _DateTimeToUnix(MyDateTime);
  Writeln('UnixTime(DateUtils - D2009): ', UnixTimeB.ToString);

  Writeln('Rückwandlung von UnixTime in TDateTime und in String');

  Writeln('(DateUtils - XE8 ): ', FormatDateTime('DD.MM.YYYY HH:MM:SS', System.DateUtils.UnixToDateTime(UnixTimeA)));
  Writeln('(DateUtils - D2009): ', FormatDateTime('DD.MM.YYYY HH:MM:SS', _UnixToDateTime(UnixTimeA)));

end;

begin
  try
    Main;
    Readln;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
also TiGU welcher Code hat Dein vertrauen?
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.071 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Konvertierung UnixTimeStamp nacht TDateTime und zurück

  Alt 5. Jun 2018, 14:43
@TiGU

ganz so einfach ist es nicht, wie schon in #4 vermeldet passen die Ergebnisse nicht.

also TiGU welcher Code hat Dein vertrauen?
Der TE hat im Profil zu stehen: Delphi 10.2 Tokyo Starter, bei mir steht Delphi 10.2 Berlin Professional und bei dir steht Delphi 10.2 Tokyo Professional...warum wird jetzt die Funktion aus dem Jahre 2008 hervorgeholt?
Das früher mal etwas nicht gestimmt hat kann ja gut sein, aber jetzt ist das doch nicht mehr relevant.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Konvertierung UnixTimeStamp nacht TDateTime und zurück

  Alt 5. Jun 2018, 16:17
Mit der alten Version da habe ich Schuld, ich sah nur vom Ghostwalger den Source, startete mein D2009 und teilte den Inhalt. Tut mir leid Khostwalker und alle anderen!!

Ich habe es selber noch nicht getestet aber ich vermute für vor 1899 muss man das andere Delta nehmen (wenn Input negativ ist?).

edit
Ps: Die Konstanten stammen bei mir aus SysUtils.pas nicht aus DateUtils.pas.

edit #2
Also die Tokyo Version bekomme ich nicht so einfach raus kopiert, die greift auf viele Sub-Funktionen zurück aber wie man am Alter Mann Beispiel sehen kann, funktioniert der "XE8-Way" (auch in Starter enthalten) weitaus zuverlässiger ohne weiteres zu tun oder herum rechnen und biegen.
Gruß vom KodeZwerg

Geändert von KodeZwerg ( 5. Jun 2018 um 16:56 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 03:04 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