Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   DateTimeToUnix 1 stunde zurück (https://www.delphipraxis.net/206411-datetimetounix-1-stunde-zurueck.html)

venice2 18. Dez 2020 06:16


DateTimeToUnix 1 stunde zurück
 
DateTimeToUnix hat in neueren Versionen von Delphi 2 Parameter.
Delphi-Quellcode:
function DateTimeToUnix(const AValue: TDateTime; AInputIsUTC: Boolean): Int64;
var
  LDate: TDateTime;
 begin
  if AInputIsUTC then
    LDate := AValue
  else
    LDate := TTimeZone.Local.ToUniversalTime(AValue);
  Result := SecondsBetween(UnixDateDelta, LDate);
  if LDate < UnixDateDelta then
     Result := -Result;
 end;
AInputIsUTC: Boolean der 2 Parameter den gibt es nicht unter D2010.
Wie kann ich nun die Zeit übergeben das ich in unserer Zeitzone liege. bsp. 5 Uhr und nicht 4

In 10.4 schalte ich dazu den parameter AInputIsUTC auf false.
Wie ich schon sagte das geht so nicht unter D2010.
Das Problem ich liege mit allen Sendungen um 1 Stunde zurück und die EPG Daten stimmen dann nicht.
Ich muss die Unix zeit schicken da ansonsten mein send String einen Fehler zurück gibt.

Delphi-Quellcode:
function DateTimeToUnix(const AValue: TDateTime): Int64;
begin
  Result := Round((AValue - UnixDateDelta) * SecsPerDay);
end;

Klaus01 18. Dez 2020 06:59

AW: DateTimeToUnix 1 stunde zurück
 
.. geht es in D2010 wenn Du den Wert nicht als raw TDateTime übergibst
sonder ihn erst in den UTC Zeitbereich bringst?
Delphi-Quellcode:
TTimeZone.Local.ToUniversalTime(AValue);
Grüße
Klaus

venice2 18. Dez 2020 07:14

AW: DateTimeToUnix 1 stunde zurück
 
Zitat:

Zitat von Klaus01 (Beitrag 1479430)
.. geht es in D2010 wenn Du den Wert nicht als raw TDateTime übergibst
sonder ihn erst in den UTC Zeitbereich bringst?
Delphi-Quellcode:
TTimeZone.Local.ToUniversalTime(AValue);
Grüße
Klaus

Hmm.. verstehe ich jetzt nicht was du meinst
Das habe ich.

Delphi-Quellcode:
function DateTimeToUnix(const AValue: TDateTime): Int64;
begin
  Result := Round((AValue - UnixDateDelta) * SecsPerDay);
end;
Der Aufruf
Delphi-Quellcode:
    TimeStart := DateTimeToUnix(IncHour(Now, 0));
    TimeEnd  := DateTimeToUnix(IncDay(Now, 1));
was soll ich jetzt wohin übergeben?

Klaus01 18. Dez 2020 07:18

AW: DateTimeToUnix 1 stunde zurück
 
Delphi-Quellcode:
function DateTimeToUnix(const AValue: TDateTime): Int64;
begin
  aValue := TTimeZone.Local.ToUniversalTime(AValue);
  Result := Round((AValue - UnixDateDelta) * SecsPerDay);
end;
oder beim Aufruf

Delphi-Quellcode:
TimeStart := DateTimeToUnix(IncHour( TTimeZone.Local.ToUniversalTime(Now), 0));
Grüße
Klaus

venice2 18. Dez 2020 07:23

AW: DateTimeToUnix 1 stunde zurück
 
Zitat:

Zitat von Klaus01 (Beitrag 1479432)
Delphi-Quellcode:
function DateTimeToUnix(const AValue: TDateTime): Int64;
begin
  aValue := TTimeZone.Local.ToUniversalTime(AValue);
  Result := Round((AValue - UnixDateDelta) * SecsPerDay);
end;
oder beim Aufruf

Delphi-Quellcode:
TimeStart := DateTimeToUnix(IncHour( TTimeZone.Local.ToUniversalTime(Now), 0));
Grüße
Klaus

aValue Der Linken Seite kann nichts zugewiesen werden.
wo ist TTimeZone definiert welche unit? In DateUtils jedenfalls nicht.
Danke.

Klaus01 18. Dez 2020 07:30

AW: DateTimeToUnix 1 stunde zurück
 
Zitat:

Zitat von venice2 (Beitrag 1479433)
wo ist TTimeZone definiert welche unit? In DateUtils jedenfalls nicht.
Danke.

in 10.3. ist TTimeZone in System.DateUtils zu finden.
Dann scheint es diese Routine für D2010 nicht zu geben.

Vielleicht hilft Dir das dann weiter -> https://stackoverflow.com/questions/...t-it-back-from

venice2 18. Dez 2020 07:31

AW: DateTimeToUnix 1 stunde zurück
 
Zitat:

Zitat von Klaus01 (Beitrag 1479434)
Zitat:

Zitat von venice2 (Beitrag 1479433)
wo ist TTimeZone definiert welche unit? In DateUtils jedenfalls nicht.
Danke.

in 10.3. ist TTimeZone in System.DateUtils zu finden.
Dann scheint es diese Routine für D2010 nicht zu geben.

Yep denn dann hätte ich die Funktion von 10.4 direkt nehmen können.
Welche Möglichkeit gibt es denn sonst noch das muss doch irgendwie gehen.

Klaus01 18. Dez 2020 07:35

AW: DateTimeToUnix 1 stunde zurück
 
.. den Link hast Du schon gesehen?
https://stackoverflow.com/questions/...t-it-back-from

venice2 18. Dez 2020 07:39

AW: DateTimeToUnix 1 stunde zurück
 
Zitat:

Zitat von Klaus01 (Beitrag 1479436)

ja Danke.
Nutzt mir nichts die Rückgabe von DateTimeToUnix ist Int64 kein TDateTime.
Verstehe ich nicht wie hat man das denn unter D2010 geregelt denn das dürfte ja so neu nicht sein.

Klaus01 18. Dez 2020 07:50

AW: DateTimeToUnix 1 stunde zurück
 
.. wen Du das TDateTime Ergebnis zu einem Unix-Timestamp wandelst - dann hast Du wieder Int64.

venice2 18. Dez 2020 07:51

AW: DateTimeToUnix 1 stunde zurück
 
Zitat:

Zitat von Klaus01 (Beitrag 1479439)
.. wen Du das TDateTime Ergebnis zu einem Unix-Timestamp wandelst - dann hast Du wieder Int64.

Beispiel?
Keine Ahnung was ich da jetzt von benutzen soll.

Habe mal gesucht . .. Bei Google suchenDateTimeToUnix to local time delphi D2010
Result so gut wie nichts

Moombas 18. Dez 2020 08:05

AW: DateTimeToUnix 1 stunde zurück
 
@venice2: Müsste nicht folgendes etwas sein was da passt wegen der Zeitzone?

https://www.delphipraxis.net/523002-post5.html

venice2 18. Dez 2020 08:07

AW: DateTimeToUnix 1 stunde zurück
 
Zitat:

Zitat von Moombas (Beitrag 1479443)
@venice2: Müsste nicht folgendes etwas sein was da passt wegen der Zeitzone?

https://www.delphipraxis.net/523002-post5.html

Danke es wird überall TDateTime zurückgegeben ich brauche aber Int64

Keine Idee im Moment wie ich TDateTime wieder zurück nach Int64 setzen soll.
Bin vielleicht zu blöd dafür.

Moombas 18. Dez 2020 08:12

AW: DateTimeToUnix 1 stunde zurück
 
Zitat:

Zitat von venice2 (Beitrag 1479445)
Zitat:

Zitat von Moombas (Beitrag 1479443)
@venice2: Müsste nicht folgendes etwas sein was da passt wegen der Zeitzone?

https://www.delphipraxis.net/523002-post5.html

Danke es wird überall TDateTime zurückgegeben ich brauche aber Int64

Keine Idee im Moment wie ich TDateTime wieder zurück nach Int64 setzen soll.
Bin vielleicht zu blöd dafür.

Naja, also ich würde es so machen:
Zeit ermitteln als TDateTime und ggf. Zeitzone anpassen (was ich oben im Link meinte)
Danach erst die Umwandlung mit DateTimeToUnix in dein gewünschtes Format und übergeben.

Müsste es nicht dann passen?

Klaus01 18. Dez 2020 08:15

AW: DateTimeToUnix 1 stunde zurück
 
.. wenn Du aus dem SO link Beitrag 11 diese Routine
Function DateTime2UnivDateTime(d:TDateTime):TDateTime benutzt

Delphi-Quellcode:
unixUTCTimeStamp := DateTimeToUnix(DateTime2UnivDateTime(now))

venice2 18. Dez 2020 08:20

AW: DateTimeToUnix 1 stunde zurück
 
Zitat:

Zitat von Klaus01 (Beitrag 1479447)
.. wenn Du aus dem SO link Beitrag 11 diese Routine
Function DateTime2UnivDateTime(d:TDateTime):TDateTime benutzt

Delphi-Quellcode:
unixUTCTimeStamp := DateTimeToUnix(DateTime2UnivDateTime(now))

Danke habe es versucht immer noch 1 Stunde zurück.
Frühstücksfernsehen fängt dann um 4:30 an.

Delphi-Quellcode:
function TzSpecificLocalTimeToSystemTime(lpTimeZoneInformation: PTimeZoneInformation; var lpLocalTime, lpUniversalTime: TSystemTime): BOOL; stdcall;
function TzSpecificLocalTimeToSystemTime; external kernel32 name 'TzSpecificLocalTimeToSystemTime';
//...
Function DateTime2UnivDateTime(d:TDateTime):TDateTime;
var
 TZI:TTimeZoneInformation;
 LocalTime, UniversalTime:TSystemTime;
begin
  GetTimeZoneInformation(tzi);
  DateTimeToSystemTime(d,LocalTime);
  TzSpecificLocalTimeToSystemTime(@tzi,LocalTime,UniversalTime);
  Result := SystemTimeToDateTime(UniversalTime);

end;
Delphi-Quellcode:
TimeStart := DateTimeToUnix(DateTime2UnivDateTime(IncHour(Now, 0)));

Moombas 18. Dez 2020 08:24

AW: DateTimeToUnix 1 stunde zurück
 
Blöde Frage aber müsste da nicht anstatt der 0 eine 1 sein, also:
TimeStart := DateTimeToUnix(DateTime2UnivDateTime(IncHour(Now, 1)));

Wobei das eigentlich ja nur ein "workaround" sein kann. Du müsstest anhand dessen ob Sommerzeit oder Winterzeit ist, die "1" anpassen.
RETURN VALUE
0 Daylight saving time is not used in the current time zone, because there are no transition dates or automatic adjustment for daylight saving time is disabled.
1 The system is operating in the range covered by the StandardDate member of the TIME_ZONE_INFORMATION structure.
2 The system is operating in the range covered by the DaylightDate member of the TIME_ZONE_INFORMATION structure.
Wenn ich also GetTimeZoneInformation() richtig verstehe, könntest du es hier einsetzen:

GetTimeZoneInformation(tzi);
TimeStart := DateTimeToUnix(DateTime2UnivDateTime(IncHour(Now, tzi)));

venice2 18. Dez 2020 08:25

AW: DateTimeToUnix 1 stunde zurück
 
Zitat:

Zitat von Moombas (Beitrag 1479449)
Blöde Frage aber müsste da nicht anstatt der 0 eine 1 sein, also:
TimeStart := DateTimeToUnix(DateTime2UnivDateTime(IncHour(Now, 1)));

Nein.
Delphi-Quellcode:
    TimeStart := DateTimeToUnix(DateTime2UnivDateTime(IncHour(Now, 0)));
    //DateTimeToUnix(IncHour(Now, 0));
    TimeEnd  := DateTimeToUnix(DateTime2UnivDateTime(IncDay(Now, 1)));
    //DateTimeToUnix(IncDay(Now, 1))
Delphi-Quellcode:
DateTimeToUnix(IncHour(Now, 0), false);
DateTimeToUnix(IncDay(Now, 1, false))
funktioniert einwandfrei unter 10.4

EDIT:
Wenn ich dort eine 1 einfügen würde dann müsste ich jetzt schon Das Frühstücksfernsehen laut der EPG Daten starten können und zwar in der Zeit von 9:00 > 11:00
Das stimmt aber nicht. Die Sendung läuft zur jetzigen zeit noch nicht.
Und die läuft eigentlich erst von 10 > 12 Uhr.. Nach wie vor ich liege um 1 Stunde zurück.

siehe pic

Delphi.Narium 18. Dez 2020 09:11

AW: DateTimeToUnix 1 stunde zurück
 
In Unix ist die Zeit doch Sekunden seit 1.1.1970.

1 Stunde sind 60 Minuten * 60 Sekunden -> 3600 Sekunden.

Unixzeit in Greenwich (UTC) + 3600 müsste dann doch die Uhrzeit bei uns (Berlin) ergeben?
Unsere Uhrzeit -1 Stunde ergibt UTC.

Oder irre ich da?

Also ungefähr sowas:
Delphi-Quellcode:
function DateTimeToUnixWithOffSet(const AValue: TDateTime; const AOffSet : Int64): Int64;
begin
  Result := Round((AValue - UnixDateDelta) * SecsPerDay) + AOffSet;
end;

...

  TimeStart := DateTimeToUnixWithOffSet(Now, -3600); // Eine Stunde zurück -> UTC
  TimeEnd  := DateTimeToUnixWithOffSet(Now, 3600); // Eine Stunde vor -> ergibt eine Zeitspanne von 2 Stunden
Oder eventuell:
Delphi-Quellcode:
TimeStart := DateTimeToUnix(DateTime2UnivDateTime(DecHour(Now, 1)));
Nur hab' ich keine Ahnung, ob es DecHour gibt, Google findet es jedenfalls nicht.

Kann IncHour auch mit negativen Zahlen umgehen? Dann
Delphi-Quellcode:
TimeStart := DateTimeToUnix(DateTime2UnivDateTime(IncHour(Now, -1)));

Klaus01 18. Dez 2020 09:15

AW: DateTimeToUnix 1 stunde zurück
 
Delphi-Quellcode:
function TzSpecificLocalTimeToSystemTime(lpTimeZoneInformation: PTimeZoneInformation; var lpLocalTime, lpUniversalTime: TSystemTime): BOOL; stdcall;
function TzSpecificLocalTimeToSystemTime; external kernel32 name 'TzSpecificLocalTimeToSystemTime';
implementation
uses
  system.dateUtils;

Function DateTime2Utc(d:TDateTime):TDateTime;
var
 TZI:TTimeZoneInformation;
 LocalTime, UniversalTime:TSystemTime;
begin
  GetTimeZoneInformation(tzi);
  DateTimeToSystemTime(d,LocalTime);
  TzSpecificLocalTimeToSystemTime(@tzi,LocalTime,UniversalTime);
  Result := SystemTimeToDateTime(UniversalTime);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  edit1.Text := intToStr(secondsBetween(dateTime2Utc(now), encodeDate(1970,1,1)));
end;
wenn ich die Zeit hier wieder von Unix nach real Zeit umwandele,
bekomme ich die aktuelle Zeit.

venice2 18. Dez 2020 09:21

AW: DateTimeToUnix 1 stunde zurück
 
Zitat:

Zitat von Klaus01 (Beitrag 1479457)
Delphi-Quellcode:
function TzSpecificLocalTimeToSystemTime(lpTimeZoneInformation: PTimeZoneInformation; var lpLocalTime, lpUniversalTime: TSystemTime): BOOL; stdcall;
function TzSpecificLocalTimeToSystemTime; external kernel32 name 'TzSpecificLocalTimeToSystemTime';
implementation
uses
  system.dateUtils;

Function DateTime2Utc(d:TDateTime):TDateTime;
var
 TZI:TTimeZoneInformation;
 LocalTime, UniversalTime:TSystemTime;
begin
  GetTimeZoneInformation(tzi);
  DateTimeToSystemTime(d,LocalTime);
  TzSpecificLocalTimeToSystemTime(@tzi,LocalTime,UniversalTime);
  Result := SystemTimeToDateTime(UniversalTime);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  edit1.Text := intToStr(secondsBetween(dateTime2Utc(now), encodeDate(1970,1,1)));
end;
wenn ich die Zeit hier wieder von Unix nach real Zeit umwandele,
bekomme ich die aktuelle Zeit.

Mein Ergebnis bei
Delphi-Quellcode:
DateTime2Utc(IncDay(Now, 1));
= 30.12.1899

Zitat:

DateTime2UnivDateTime
gibt es bei mir nicht.
Zitat:

TimeStart := DateTimeToUnixWithOffSet(Now, -3600);
Schlägt fehl keine unix zeit.

Klaus01 18. Dez 2020 09:26

AW: DateTimeToUnix 1 stunde zurück
 
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  edit1.Text := intToStr(secondsBetween(dateTime2Utc(incDay(now,1)), encodeDate(1970,1,1)));
end;
--> morgen um diese Zeit

venice2 18. Dez 2020 09:34

AW: DateTimeToUnix 1 stunde zurück
 
Zitat:

Zitat von Klaus01 (Beitrag 1479459)
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  edit1.Text := intToStr(secondsBetween(dateTime2Utc(incDay(now,1)), encodeDate(1970,1,1)));
end;
--> morgen um diese Zeit

Delphi-Quellcode:
    TimeStart := secondsBetween(dateTime2Utc(IncHour(now, 0)), encodeDate(1970,1,1));
    //DateTimeToUnix(IncHour(Now, 0));
    TimeEnd := secondsBetween(dateTime2Utc(IncDay(now, 1)), encodeDate(1970,1,1));
    //DateTimeToUnix(IncDay(Now, 1));
= 9:00 > 11:00 muss aber 10:00 > 12:00 sein.
Das scheint doch schwerer zu sein als gedacht.

Ich verwende auch kein UTC!
Siehe!
Delphi-Quellcode:
function DateTimeToUnix(const AValue: TDateTime; AInputIsUTC: Boolean): Int64;
var
  LDate: TDateTime;
 begin
  if AInputIsUTC then
    LDate := AValue
  else
    LDate := TTimeZone.Local.ToUniversalTime(AValue);
  Result := SecondsBetween(UnixDateDelta, LDate);
  if LDate < UnixDateDelta then
     Result := -Result;
 end;
Mein Aufruf in 10.4
DateTimeToUnix(IncHour(Now, 0), false);

Klaus01 18. Dez 2020 09:44

AW: DateTimeToUnix 1 stunde zurück
 
Delphi-Quellcode:
function DateTimeToUnix(const AValue: TDateTime; AInputIsUTC: Boolean): Int64;
var
  LDate: TDateTime;
 begin
  if AInputIsUTC then
    LDate := AValue
  else
    LDate := TTimeZone.Local.ToUniversalTime(AValue); // <<----
  Result := SecondsBetween(UnixDateDelta, LDate);
  if LDate < UnixDateDelta then
     Result := -Result;
 end;
mit dem Parameter "AInputIsUTC" gibts Du an, ob der übergebene Zeitwert schon auf UTC "normiert" wurde.
Bei false wird er dann im else Zweig auf UTC "normiert"

venice2 18. Dez 2020 09:46

AW: DateTimeToUnix 1 stunde zurück
 
Zitat:

Zitat von Klaus01 (Beitrag 1479461)
Delphi-Quellcode:
function DateTimeToUnix(const AValue: TDateTime; AInputIsUTC: Boolean): Int64;
var
  LDate: TDateTime;
 begin
  if AInputIsUTC then
    LDate := AValue
  else
    LDate := TTimeZone.Local.ToUniversalTime(AValue); // <<----
  Result := SecondsBetween(UnixDateDelta, LDate);
  if LDate < UnixDateDelta then
     Result := -Result;
 end;
mit dem Parameter "AInputIsUTC" gibts Du an, ob der übergebene Zeitwert schon auf UTC "normiert" wurde.
Bei false wird er dann im else Zweig auf UTC "normiert"

Ach so ok. ;) Hab dann wohl was falsch verstanden. Danke
Aber leider tun es die bisherigen Funktionen nicht. Schade

Naja wenn es nicht klappt dann lass ich es mit den EPG Kram einfach und gut ist.
Frage mich nur wie man das früher gemacht hat wenn die Leute eine Stunde zurück setzen mussten.
Ging doch auch ohne 10.4 (in D6 oder was auch immer)

EDIT:
Nun gut Fakt ist jedoch das genau AInputIsUTC den unterschied ausmacht ob ich nun eine stunde mehr oder weniger übergebe.
Bei false ist die Zeit meine Locale bei true liegt sie 1 Stunde zurück.

Klaus01 18. Dez 2020 11:58

AW: DateTimeToUnix 1 stunde zurück
 
.. die Frage ist doch must Du die lokale Zeit übergeben?
im ETSI Standard https://www.etsi.org/deliver/etsi_en...07v010201p.pdf
Seite 39, wird die start_time und stop_time in UTC erwartet.

start_time The start time of the event In Universal Time, Co-ordinated (UTC) and Modified Julian Date (MJD) (see also time_date). If the start time is not known, a notional time which positions the event during the day should be transmitted. Example: 93-10-13 12:45 = 0 x C0791245.
stop_time The stop time of the event in Universal Time, Co-ordinated (UTC). This field is coded as 16 bits coded as 4 digit in 4 bit Binary Coded Decimal (BCD). If undefined all bits shall be set to 1.

Wenn Du dann die Zeit in Deiner Liste anzeigen willst, musst Du sie anhand der Zeitzone in eine lokale Zeit umwandeln.
Im Winter (normal Zeit) ist die normal Zeit in Deutschland UTC +1

Delphi-Quellcode:
function TzSpecificLocalTimeToSystemTime(lpTimeZoneInformation: PTimeZoneInformation; var lpLocalTime, lpUniversalTime: TSystemTime): BOOL; stdcall;
function TzSpecificLocalTimeToSystemTime; external kernel32 name 'TzSpecificLocalTimeToSystemTime';
implementation
uses
  system.dateUtils;

Function DateTime2Utc(d:TDateTime):TDateTime;
var
 TZI:TTimeZoneInformation;
 LocalTime, UniversalTime:TSystemTime;
begin
  GetTimeZoneInformation(tzi);
  DateTimeToSystemTime(d,LocalTime);
  TzSpecificLocalTimeToSystemTime(@tzi,LocalTime,UniversalTime);
  Result := SystemTimeToDateTime(UniversalTime);
end;


function DateTimeToUnix(const AValue: TDateTime; AInputIsUTC: Boolean): Int64;
var
  LDate: TDateTime;
 begin
  if AInputIsUTC then
    LDate := AValue
  else
    LDate :=DateTimeToUtc(AValue); // <<----
  Result := SecondsBetween(UnixDateDelta, LDate);
  if LDate < UnixDateDelta then
     Result := -Result;
 end;
wobei UnixDateDelta eine Konstante ist: UnixDateDelta: Integer = $63E1;

Grüße
Klaus

venice2 18. Dez 2020 12:07

AW: DateTimeToUnix 1 stunde zurück
 
Zitat:

.. die Frage ist doch must Du die lokale Zeit übergeben?
Ja.

Zitat:

Wenn Du dann die Zeit in Deiner Liste anzeigen willst, musst Du sie anhand der Zeitzone in eine lokale Zeit umwandeln.
Nein ich muss sie schon im richtigen Format und zwar + 1 Stunde an den Server schicken.
Tue ich das nicht ist die aktuelle zeit in den EPG Daten falsch.

Siehe die Funktion aus Delphi 14.4

Auf Streife läuft von 13 > 14 Uhr nicht von 12 > 13.
Und das ist was ich mit deiner änderung angezeigt bekomme.
Es fehlt weiterhin 1 Stunde.
Trotzdem Danke für den versuch. (noch mal ein Shot)

Unter 14.4 wird diese zeile ausgeführt aber nur wenn AInputIsUTC false ist.
Delphi-Quellcode:
LDate := TTimeZone.Local.ToUniversalTime(AValue);

danach habe ich die korrekte Zeit nämlich + 1 Stunde. (Local Zeit)

Ich vordere eine *.json an und zwar mit der übergeben Zeit die ich an den Server schicke.

EDIT:
TimeStart := DateTimeToUnix(IncHour(Now, 0), true);
TimeEnd := DateTimeToUnix(IncDay(Now, 1), true);

funktioniert bei dir.
false nicht.. also genau umgekehrt.

venice2 18. Dez 2020 12:28

AW: DateTimeToUnix 1 stunde zurück
 
Nach vielen Rumprobieren bekomme ich das korrekte Ergebnis mit einer Zeile.

Delphi-Quellcode:
    TimeStart := SecondsBetween(UnixDateDelta, IncHour(Now, 0));
    //DateTimeToUnix(IncHour(Now, 0), true);
    TimeEnd := SecondsBetween(UnixDateDelta, IncDay(Now, 1));
    //DateTimeToUnix(IncDay(Now, 1), true);
Vielen Dank für deine Hilfe.

Aber:
Du wirst es nicht glauben die gleiche Funktion in 10.4 ergibt ein ganz anderes Resultat
nämlich von 14 -> 15 Uhr.

Also da läuft etwas schwer daneben in Delphi
D2010 via 10.4

Ich mache mal ein Video.

venice2 18. Dez 2020 12:50

AW: DateTimeToUnix 1 stunde zurück
 
links gelöscht..

venice2 19. Dez 2020 13:03

AW: DateTimeToUnix 1 stunde zurück
 
Zitat:

Nach vielen Rumprobieren bekomme ich das korrekte Ergebnis mit einer Zeile.
War wohl ein Irrtum die korrekte zeit mit D2010 zu bekommen ich schlichtweg unmöglich.
DateTimeToUnix ist einfach ungenügend in D2010 ok alte version.. von daher @seufz..

Bei dem was hier jetzt alles so versucht wurde muss ich das wohl so akzeptieren.
Macht keinen sinn EPG Daten einzulesen zu wollen die eh nicht stimmen.
Danke für eure Hilfe trotzdem.

Egal.. werfe das EPG wieder raus macht so keinen sinn.

Delphi.Narium 19. Dez 2020 13:33

AW: DateTimeToUnix 1 stunde zurück
 
Woher beziehst Du Deine EPG-Daten?

Wenn ich mit meinem PascalScript die Daten von http://mobile.hoerzu.de/programbystation auswerte, stimmen die Ergebnisse.

Die Uhrzeiten sind in UTC und ich muss auf den Unixwert 3600 Sekunden addieren, damit ich auf die Ortszeit komme.

Quasi: UnixToDateTime("Zeit aus der JSON" + 3600)

venice2 19. Dez 2020 15:37

AW: DateTimeToUnix 1 stunde zurück
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1479551)
Woher beziehst Du Deine EPG-Daten?

Wenn ich mit meinem PascalScript die Daten von http://mobile.hoerzu.de/programbystation auswerte, stimmen die Ergebnisse.

von zattoo
Zitat:

Die Uhrzeiten sind in UTC und ich muss auf den Unixwert 3600 Sekunden addieren, damit ich auf die Ortszeit komme.
Nutzt dir doch nichts.
Du hast zwar dann lokal die richtige Zeit weil du sie im nachhinein geändert hast aber deine Programme sind trotzdem falsch
weil du die EPG Daten von in 1 Stunde angefordert hast und nicht die deiner Lokalen Echtzeit.

Es geht nicht darum das ich irgendetwas addieren muss sondern ich muss die Ortszeit als UTC schicken. Die Unixzeit liegt nun mal 1 stunde vor.
Schicke ich die liegen alle meine Sendezeiten um 1 stunde vor damit kann ich aber nichts anfangen.
Ich will wissen was jetzt läuft und nicht erst in einer Stunde.

Und das geht wie hier schon vergeblich versuch einfach nicht mit D2010, 14.4 funktioniert aber das reicht mir nicht.
Es geht nicht um UnixToDateTime sondern um DateTimeToUnix schicke ich die verkehrte zeit 1 stunde vor sind alle EPG Daten nicht verwendbar.
Ich muss meine Lokale Zeit als UnixZeit an den Server schicken um die EPG Daten von den jetzt laufenden Programmen zu erhalten und nicht erst die in 1 Stunde.
Diese interessieren mich nicht.

Egal.. es wurde hier schon alles versucht.

mytbo 19. Dez 2020 19:01

AW: DateTimeToUnix 1 stunde zurück
 
Versuche es mal mit mORMot Unit SynCommons.pas.
Delphi-Quellcode:
var
  tlb: TTimeLogBits;
begin
  tlb.FromUTCTime;
  ShowMessage(tlb.Text(True));
  ShowMessage(IntToStr(tlb.ToUnixTime));
end;
Den Sourcecode habe ich jetzt nicht getestet. Wenns nicht passt, es gibt einige Zeitfunktionen in der Unit.

Bis bald...
Thomas

venice2 20. Dez 2020 04:59

AW: DateTimeToUnix 1 stunde zurück
 
Zitat:

Zitat von mytbo (Beitrag 1479566)
Versuche es mal mit mORMot Unit SynCommons.pas.
Delphi-Quellcode:
var
  tlb: TTimeLogBits;
begin
  tlb.FromUTCTime;
  ShowMessage(tlb.Text(True));
  ShowMessage(IntToStr(tlb.ToUnixTime));
end;
Den Sourcecode habe ich jetzt nicht getestet. Wenns nicht passt, es gibt einige Zeitfunktionen in der Unit.

Bis bald...
Thomas

Danke aber wüsste nicht was ich damit anfangen sollte.

Ich muss ja die aktuelle zeit übergeben und mit ToUnixTime ist das nicht gegeben.
Die anderen habe ich schon geprüft und funktionieren auch nicht so wie sie sollen.

Die Zeit unter D 10.4 ist korrekt aber ich kann es so in D2010 nicht umsetzen.
Weil ich aber 32Bit und 64Bit gleichhallten möchte in der Funktionsweise muss ich so leider darauf verzischten.

Und nein ich will D 14.4 nicht für 32Bit verwenden da ich nicht einsehe das mein Kompilat um das 4 Fache in der Größe ansteigt.

DateTimeToUnixTime SynCommons
Funktioniert nicht einmal unter 10.4 korrekt. Nur mal so nebenbei.
Ich will nicht sehen was in einer Stunde läuft (The Voice of Germany) sondern das was jetzt läuft. (Auf Streife)
Siehe Shots!

EDIT:
Nicht das wir uns missverstehen.

DateTimeToUnixTime ist schon richtig es sendet die UnixZeit + 1 Stunde.
Nur DateTimeToUnix (DateUtils) schickt die UnixZeit und zieht die 1 Stunde ab abhängig vom gesetzten flag AInputIsUTC das ist der feine Unterschied.
Die Zeit wird also direkt nach UTC konvertiert.

Klaus01 20. Dez 2020 08:16

AW: DateTimeToUnix 1 stunde zurück
 
Guten Morgen Emil,

dieser Code macht eigentlich das was Du möchtest.

Delphi-Quellcode:
function TzSpecificLocalTimeToSystemTime(lpTimeZoneInformation: PTimeZoneInformation; var lpLocalTime, lpUniversalTime: TSystemTime): BOOL; stdcall;
function TzSpecificLocalTimeToSystemTime; external kernel32 name 'TzSpecificLocalTimeToSystemTime';


implementation

// trennt die Lokale Zeit von der TimeZone
Function DateTimeToUtc(d:TDateTime):TDateTime;
var
 TZI:TTimeZoneInformation;
 LocalTime, UniversalTime:TSystemTime;
begin
  GetTimeZoneInformation(tzi);
  DateTimeToSystemTime(d,LocalTime);
  TzSpecificLocalTimeToSystemTime(@tzi,LocalTime, UniversalTime);
  Result := SystemTimeToDateTime(UniversalTime);
end;


function DateTimeToUnix(const AValue: TDateTime; AInputIsUTC: Boolean): Int64;
var
  LDate: TDateTime;
 begin
  if AInputIsUTC then
    LDate := AValue
  else
    LDate := DateTimeToUtc(AValue);
  Result := SecondsBetween(UnixDateDelta, LDate);
  if LDate < UnixDateDelta then
     Result := -Result;
 end;



procedure TForm1.Button1Click(Sender: TObject);
var
  lDate: TDateTime;
begin
  lDate := now;
  Memo1.Lines.Add('lokale Zeit:      ' + dateTimeToStr(lDate));
  Memo1.Lines.Add('standort Utc:     ' + dateTimeToStr(DateTimeToUtc(lDate)));
  Memo1.Lines.Add('lokale Zeit Unix: ' + intToStr(DateTimeToUnix(lDate, true)));
  Memo1.Lines.Add('standort UTC Unix: ' + intToStr(DateTimeToUnix(lDate, false)));
end;

Code:
lokale Zeit:      20.12.2020 09:11:28
standort Utc:     20.12.2020 08:11:28
lokale Zeit Unix: 1608455488
standort UTC Unix: 1608451888
Grüße
Klaus

venice2 20. Dez 2020 08:19

AW: DateTimeToUnix 1 stunde zurück
 
Guten Morgen Klaus :)
Danke für deine Mühe sieht gut aus werde es nochmal versuchen.

venice2 20. Dez 2020 08:51

AW: DateTimeToUnix 1 stunde zurück
 
Das ist was ich bekomme..
Delphi-Quellcode:
    ShowMessage('TimeStart = ' + IntToStr(TimeStart) +
      #13#10 + 'TimeEnd = ' + IntToStr(TimeEnd) +
      #13#10 + 'lokale Zeit: ' + DateTimeToStr(IncHour(Now, 0)) +
      #13#10 + 'standort Utc: ' + DateTimeToStr(DateTimeToUtc(IncHour(Now, 0))));
Daten die ausgewertet werden..
Delphi-Quellcode:
    gEpg[iRun].ry_u := docPrograms.I['ry_u'];
    if gEpg[iRun].ry_u <> 0 then
      SEnd[iRun] := UnixToDateTime(gEpg[iRun].ry_u); // End Zeit

    gEpg[iRun].s:= docPrograms.I['s'];
    if gEpg[iRun].s <> 0 then
      sStart[iRun] := UnixToDateTime(gEpg[iRun].s); // Start Zeit

Siehe Pics Daten sind alle Falsch das ist was ich nicht verstehe.
Falsche Programme falsche Zeit.

Unter 14.4
Siehe blaue Pic (Was macht 14.4 anders? )

Der String der gesendet wird
Delphi-Quellcode:
    SendStr := FProvRec.URL +
      cPathEPG +
      FProvRec.PWRHASH +
      '?end=' + inttostr(TimeEnd) +
      '&start=' + inttostr(TimeStart) +
      '&format=json' + '&details=True';
Daten die Initialisiert werden für den SendStr
Delphi-Quellcode:
    TimeStart := DateTimeToUnix(IncHour(Now, 0), false);
    TimeEnd := DateTimeToUnix(IncDay(Now, 1), false);
stimmen die Zeiten nicht dann lade ich die falschen EPG Daten.

Klaus01 20. Dez 2020 09:17

AW: DateTimeToUnix 1 stunde zurück
 
in 10.4 sieht UnixToDateTime so aus:

Delphi-Quellcode:
function UnixToDateTime(const AValue: Int64; AReturnUTC: Boolean): TDateTime;
begin
  if AReturnUTC then
    Result := IncSecond(UnixDateDelta, AValue)
  else
    Result := TTimeZone.Local.ToLocalTime(IncSecond(UnixDateDelta, AValue));
end;
Da es TTimeZone in D2010 noch nicht gibt, muss dies wieder ersetzt werden.

Delphi-Quellcode:
function TzSpecificLocalTimeToSystemTime(lpTimeZoneInformation: PTimeZoneInformation; var lpLocalTime, lpUniversalTime: TSystemTime): BOOL; stdcall;
function SystemTimeToTzSpecificLocalTime(lpTimeZoneInformation: PTimeZoneInformation; var lpUniversalTime,lpLocalTime: TSystemTime): BOOL; stdcall;

implementation

function TzSpecificLocalTimeToSystemTime; external kernel32 name 'TzSpecificLocalTimeToSystemTime';
function SystemTimeToTzSpecificLocalTime; external kernel32 name 'SystemTimeToTzSpecificLocalTime';

Function UtcToLocalDateTime(d:TDateTime):TDateTime;
var
 TZI:TTimeZoneInformation;
 LocalTime, UniversalTime:TSystemTime;
begin
  GetTimeZoneInformation(tzi);
  DateTimeToSystemTime(d,UniversalTime);
  SystemTimeToTzSpecificLocalTime(@tzi,UniversalTime,LocalTime);
  Result := SystemTimeToDateTime(LocalTime);
end;
->>
Delphi-Quellcode:
function UnixToDateTime(const AValue: Int64; AReturnUTC: Boolean): TDateTime;
begin
  if AReturnUTC then
    Result := IncSecond(UnixDateDelta, AValue)
  else
    Result := UtcToLocalDateTime(IncSecond(UnixDateDelta, AValue));
end;
Grüße
Klaus

venice2 20. Dez 2020 09:22

AW: DateTimeToUnix 1 stunde zurück
 
Ja nur was möchtest du mir jetzt sagen es funktioniert nicht habe ich anhand der Bilder dokumentiert.
Ach so das ist die andere Funktion.. werde es testen. Danke.

Der vergleich mit deiner Änderung..
Irgendwie will das nicht.

EDIT:
Habe es nochmal geprüft und festgestellt das dort noch ein Fehler war.
Hatte bei
Delphi-Quellcode:
TimeStart := DateTimeToUnix(IncHour(Now, 0), false);


true anstatt false.

Jetzt scheint es zu gehen.. werde es weiterhin noch beobachten.
Bin dir sehr zu dank verpflichtet ohne dich hätte ich es aufgegeben. (hast meinen Tag gerettet) :)
Bei Sportschau fehlt die Endzeit ist aber ein Fehler in der Json die fehlt dort! Kann da nichts machen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:02 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-2025 by Thomas Breitkreuz