Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Zeit dazu addieren (https://www.delphipraxis.net/209497-zeit-dazu-addieren.html)

FunThomas 14. Dez 2021 12:22

Zeit dazu addieren
 
Hallo Allerseits,

ich quäle mich jetzt seit einer Weile mit TDateTime und TTimeStamp rum aber werde nicht so recht glücklich.
Ich möchte mir eine GUI bauen die ein Diagramm anzeigt mit Zahlenwerten die entsprechend des Zeitpunktes geordnet sind.
Jetzt dachte ich mir ich kann ja mit Mouseover die Postionen holen und würde dann gern entsprechend der Koordinaten mir meine Zeit und den Wert berechnen (oder den nächsten aus der Werteliste) raussuchen und in einem extra Edit anzeigen lassen.

Primär geht es mir nur um die Zeitberechnung, ich habe eine TDateTime Startzeit (entspricht X=0), meine Koordinate in X Richtung (vom Mouseover) und einer Konstante PixelPerSecond.

Ich dachte mir am einfachsten ist es mit einem TTimeStamp den ich anlege und weise dann einfach der Time den Wert an Milisekunden zu:
Code:
var
  Diff_TS  : tTimeStamp;
  Zeit_diff : TDateTime;

  Diff_TS.Time := Round (X * PixelPerSecond) * 1000;
  Zeit_diff   := TimeStampToDateTime(Diff_TS);
Leider bin ich damit am 01.11.4662 :-(

Gibt es einen einfachen Weg um zu einem TDateTime eine gewisse Anzahl an Sekunden zu addieren, welches auch dann Datumsübergreifend funktioniert?

Danke im Voraus,
Thomas

Delphi.Narium 14. Dez 2021 12:42

AW: Zeit dazu addieren
 
TDateiTime ist einfach nur eine Zahl, bei der der Vorkommaanteil die Anzahl der Tage angibt, der Nachkommaanteil die Teile eines Tages.

TDateTime = 1 -> 1 Tag.

1 Tag = 60 Sekunden * 60 Minuten * 24 Stunden = 86400 Sekunden.

1 / 86400 = 1,1574074074074074074074074074074e-5.

Wenn Du die Anzahl der Sekunden weißt, dann rechnest Du einfach Anzahlsekunden * 1 / 86400.

Durch Addition oder Subtraktion kannst Du dann eine um die Anzahl Sekunden in der Zukunft liegenden bzw. einen in der Vergangenheit liegenden Zeitpunkt errechnen.

Bei Millisekunden rechnest Du dann halt mit 1 / 86400000 * Millisekunden.

Zur Vereinfachung machst Du Dir irgendwo einen Konstante
Delphi-Quellcode:
dtOneMilliSec : TDateTime = 1 / 86400000;
und rechnest dann mit der, das macht den Quelltext auch sofort lesbarer.

Uwe Raabe 14. Dez 2021 12:57

AW: Zeit dazu addieren
 
Zitat:

Zitat von FunThomas (Beitrag 1499090)
Gibt es einen einfachen Weg um zu einem TDateTime eine gewisse Anzahl an Sekunden zu addieren, welches auch dann Datumsübergreifend funktioniert?

Die Unit System.DateUtils bietet eine Reihe von Funktionen dafür, z.B. diese:
Delphi-Quellcode:
function IncSecond(const AValue: TDateTime;
  const ANumberOfSeconds: Int64 = 1): TDateTime; inline;

FunThomas 14. Dez 2021 13:30

AW: Zeit dazu addieren
 
Vielen Dank das IncSecond war die einfache Lösung

rokli 14. Dez 2021 13:51

AW: Zeit dazu addieren
 
Und IncSecond lässt auch negative Werte zu; das entspricht dann einer Zeit-Subtraktion.

FunThomas 3. Jan 2022 11:24

AW: Zeit dazu addieren
 
Hi Leute,
mit der Zeit habe ich jetzt das nächste Problem ;-)

gibt es eine Möglichkeit die Zeit auf die nächsten vollen 5 Minuten aufzurunden?
also nehmen wir an ich habe hier TDateTime mit Wert 27.09.2021 12:25:01 und den möchte ich auf den nächsten vollen 5 min Takt aufrunden
also auf 27.09.2021 12:30:00

gibt es da eine bessere Methode ausser mir jeweils die MinuteOfTheHour/SecondOfTheMinute zu holen und dann zu den Sekunden dazu addieren bis wieder 0 erreicht und bei den Minuten addieren bis mod 5 als Rest 0 ergibt?

Danke im Voraus,
Thomas

Uwe Raabe 3. Jan 2022 12:56

AW: Zeit dazu addieren
 
Delphi-Quellcode:
var
  dt: TDateTime;
  interval: Int64;
  remain: UInt64;
begin
  dt := EncodeDateTime(2021, 9, 27, 12, 25, 1, 0);
  interval := (5*SecsPerMin*MSecsPerSec);
  remain := DateTimeToMilliseconds(dt) mod interval;
  dt := IncMilliSecond(dt, interval - remain);
end;

FunThomas 3. Jan 2022 17:01

AW: Zeit dazu addieren
 
Vielen Dank funktioniert super!

himitsu 3. Jan 2022 17:45

AW: Zeit dazu addieren
 
Es gibt mehrere Hilfsfunktionen

MinuteOf oder MinuteOfTheHour
RecodeMinute
ReplaceTime
...

Delphi-Quellcode:
// abrunden
RecodeMinute(D, MinuteOf(D) div 5 * 5);

// -aufrunden- [edit] auf nächste 5 Minuten
IncMinute(D, 5 - MinuteOf(D) mod 5);

// [add] aufrunden
IncMinute(D, (5 - MinuteOf(D) mod 5) mod 5);
Aber hier werden die Sekunden/Millisekunden nicht behandelt,
was beim Beispiel von Uwe durch IncMilliSecond abgefangen wird.

Ich dachte mal es gab auch eine MinuteOf-Variante, welche als Double implementiert war die Bruchteile der Sekunden/Millisekunden mit enthält.

FunThomas 3. Jan 2022 21:58

AW: Zeit dazu addieren
 
Vielen Dank!


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:08 Uhr.
Seite 1 von 2  1 2      

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