![]() |
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:
Leider bin ich damit am 01.11.4662 :-(
var
Diff_TS : tTimeStamp; Zeit_diff : TDateTime; Diff_TS.Time := Round (X * PixelPerSecond) * 1000; Zeit_diff := TimeStampToDateTime(Diff_TS); 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 |
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:
und rechnest dann mit der, das macht den Quelltext auch sofort lesbarer.
dtOneMilliSec : TDateTime = 1 / 86400000;
|
AW: Zeit dazu addieren
Zitat:
Delphi-Quellcode:
function IncSecond(const AValue: TDateTime;
const ANumberOfSeconds: Int64 = 1): TDateTime; inline; |
AW: Zeit dazu addieren
Vielen Dank das IncSecond war die einfache Lösung
|
AW: Zeit dazu addieren
Und IncSecond lässt auch negative Werte zu; das entspricht dann einer Zeit-Subtraktion.
|
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 |
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; |
AW: Zeit dazu addieren
Vielen Dank funktioniert super!
|
AW: Zeit dazu addieren
Es gibt mehrere Hilfsfunktionen
MinuteOf oder MinuteOfTheHour RecodeMinute ReplaceTime ...
Delphi-Quellcode:
Aber hier werden die Sekunden/Millisekunden nicht behandelt,
// 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); 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. |
AW: Zeit dazu addieren
Vielen Dank!
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:00 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