![]() |
Uhrzeiten vergleichen
Hallo,
ich habe eine wahrscheinlich simple Frage: Ich möchte ein Programm schreiben, dass von 06:00Uhr bis 19:00Uhr immer zur vollen Stunde etwas ausführt. Ich wollte dazu den Timer verwenden und die aktuelle Zeit mit einer vorgegebenen Zeit(en) vergleichen. Aber irgendwie klappt das nicht!
Delphi-Quellcode:
Kann mir da jemand helfen?
procedure TForm1.Timer1Timer(Sender: TObject);
var DateTime:TDateTime; begin label1.Caption:=timetostr(now); If Now() = strtotime('16:40:50')then showmessage(timetostr(now)); end; Danke |
Re: Uhrzeiten vergleichen
Ein TDateTime besteht aus dem Vorkommaanteil für das Datum und dem Nachkommaanteil für die Zeit. Um also nur Zeiten zu vergleichen, darfst Du nur den Nachkommaanteil betrachten (den bekommt man mit Frac()). Andere Möglichkeit: EncodeDate() und DecodeDate() und/oder die Funktionen aus der Unit DateUtils verwenden.
|
Re: Uhrzeiten vergleichen
Da du ja deinen Timer nicht im Millisekundenrythmus ausführen kannst, wirst du nicht geneu vergleichen lassen können.
nimm die nächste Zeit (nächste volle stunde) und prüf so
Delphi-Quellcode:
Ach ja, Now enthält auch noch die Tage(Monate,Jahre) ... die müßtest du erstmal rausrechnen.
If Trunc(Now) >= strtotime('16:00:00') then
[add] ungetestet ... mal sehn, ob ich 'nen Denkfehler hab (Frac(Time) >= StrToTime('06:00:00')) and (Frac(Time) < StrToTime('20:00:00')) prüfen ob es ab 6°° und vor 20°° (also bis kurz nach 19°°) ist Trunc(Frac(Time) * 24) > Trunc(Frac(LastTime) * 24) Zeiten in Stunden umrechnen und vergleichen
Delphi-Quellcode:
Var LastTime: TDateTime; // am Besten im Private-Abschnitt von TForm1 deklarieren
Procedure TForm1.Timer1Timer(Sender: TObject); Var Time: TDateTime; Begin Time := Now; Label1.Caption := TimeToStr(Time); If (Frac(Time) >= StrToTime('06:00:00')) and (Frac(Time) < StrToTime('20:00:00')) and (Trunc(Frac(Time) * 24) > Trunc(Frac(LastTime) * 24)) Then Begin LastTime := Time; Showmessage(TimeToStr(Time)); End; End; // und nicht vergessen LastTime zu initalisieren // LastTime := Now; |
Re: Uhrzeiten vergleichen
Hallo,
ersteinmal vielen Dank für die Antworten!!! Ich muss aber mein Verständnis noch hinterfragen:
Delphi-Quellcode:
Damit wird geprüft, es gerade zwischen 06:00 und kleiner 19:00 Uhr ist?
If (Frac(Time) >= StrToTime('06:00:00')) and (Frac(Time) < StrToTime('20:00:00'))
Delphi-Quellcode:
Damit wird geprüft, dass die aktuelle Uhrzeit größer ist als die bei der Aktion gespeicherten Uhrzeit?
and (Trunc(Frac(Time) * 24) > Trunc(Frac(LastTime) * 24)) Then Begin
Aber wo wird jede volle Stunde geprüft? Danke im Voraus |
Re: Uhrzeiten vergleichen
Warum kann ich eigentlich nicht bei der aktuelle Uhrzeit nur die Stunden, Minuten und Sekunden vergleichen und die Milisekunden unberücksichtigt lassen, wenn mein Timer alle Sekunde läuft?
|
Re: Uhrzeiten vergleichen
Versuch es mal so:
Delphi-Quellcode:
var aHour,aMin,aSec,aMSec: Word;
begin DecodeTime(now,aHour,aMin,aSec,aMSec); if (aHour in [6..19]) and (aMin = 0) and (aSec = 0) then ShowMessage('Volle Stunde'); end; |
Re: Uhrzeiten vergleichen
Des mit den Sekunden würd ich lieber weglassen, wenn er dann nähmlich wegen CPU-Verzögerungszeiten dese Sekunde "vergisst" stehste dumm da.
nun du kannst ja einfach prüfen, ob die neue Zeit in Stunden (min) >= die letzte Stunde ist. Es ist jedoch nicht sinnvoll einen Timer jede Sekunde zu starten wenn er eigentlich nur jede Stunde arbeiten sollte. Da hat dein PC viel zu viel zu tun, ohne eigentlich was zu tun. Stelle ihn doch lieber auf 30-45 min, un lass ihn sich dann selbst dynamisch auf den Zeitverbrauch reagieren, damit der dann genau zur Vollen Stunde seine Aktion ausführt |
Re: Uhrzeiten vergleichen
warum das nicht geht?
laß mal dein Programm, bei DeddyH's Code für einen Sekündchen hängen ... schwußt, die x:00:00 würde übersprungen und es passiert nix und bei Now = StrToTime('16:00:00') wird, wenn das nicht "fast" auf die Millisekunde genau um 16°° verglichen wird, auch nie was passieren. bei "meinem" Code kannst du den Timer auch locker im Minuten-Interval laufen lassen, aber selbst ein 1-Sekundenintervall würde nicht wirklich viele Systemresourcen verbrauchen. bei DeddyH's Code sollte der Timer schon sicherheitshalber mehrmals pro Sekunde diesen Vergleich ausführen und selbs da ist es nicht sicher, daß das Ereignis ausgelöst wird (wie gesagt, da braucht nur der Rechner mal kurz etwas zu sehr ausgelastet sein) Da du ja 19°° auch noch haben möchtest, wird also auf kleiner 20°° geprüft. theoretisch würde es auch ausreichen, wenn z.B. etwa so geprüft würde:
Delphi-Quellcode:
aber ganze Zahlen sehen auch nett aus
If (Stunde >= '06:00:00') and (Stunde < '19:05:00')
Die Prüfung ob es Zeit zur Anzeige ist, erfollgt meißt kurz nach der vollen Stunde, also könnte bei (Frac(Time) <= StrToTime('19:00:00')) das 19°°-Ereignis ausfallen aber mir fällt grad was auf ... das Frac bei der Stundenprüfung macht kleine Probleme bei Tageswechsel, also wenn das Programm die Nacht durchläuft.
Delphi-Quellcode:
hier werden jeweils die Stunden vor das Komma (siehe
and (Trunc(Time * 24) > Trunc(LastTime * 24)) Then Begin
![]() und sobald sich die errechnete Zahl(Zeit) ändert, wird die Nachricht angezeigt. (x = Anzahl der Tage seit 30.12.1899) 12:00 = x.5 ... x.5 * 24 = 12.0 6:00 = x.25 ... x.25 * 24 = 6.0 6:12 = x.2583 ... x.2583 * 24 = 6.2 ... Trunc(6.2) = 6 |
Re: Uhrzeiten vergleichen
Die Sekunden hatte ich erst draußen, aber ich weiß ja nicht, wie genau das nun werden soll.
|
Re: Uhrzeiten vergleichen
OK, dann laß mal die Sekunden weg, aber was glaubst du denn, was dann passiert?
ja richtig: die Nachricht wird mehrmals angezeigt OK, der Timer auf 1 Minute , da kommt dann die Nachricht maximal einmal an, oder auch garnicht :stupid: So oder so, das Intervall muß (bei deinem Code) kürzer sein, als seine Vergleichtdistanz und es immer muß das letze Ereignis gespeichert und beachtet werden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:48 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