![]() |
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. |
Re: Uhrzeiten vergleichen
@DeddyH
DAS IST SPITZE!!! GENAU WAS ISCH GESUCHT HABE! @ himitsu Deine Lösung funktionierte auch (damit will ich nur sagen, dass ich sie bei der Übernahme nicht verpfuscht habe), aber die Lösung von DeddyH verstehe ich besser. Ich werden mir aber Deine Erklärung noch sehr genau ansehen, um sie zu verstehen! Vielen Dank für die ausführlichen Informationen! @Anonymos Danke für den Hinweis, da hast Du sicherlich recht. Werde es berücksichtigen! Danke :-D :cyclops: Edit: Was ist denn, wenn ich Minuten und Sekunden weglasse und den Timer auf eine Stunde einstelle? |
Re: Uhrzeiten vergleichen
dann wird (z.B. wenn das TimerIntervall auf 1000 steht die Nachricht bis zu 3600 Mal pro Stunde angezeigt?
|
Re: Uhrzeiten vergleichen
Dann muss man sich halt merken, ob das innerhalb der aktuellen Stunde bereits passiert ist.
|
Re: Uhrzeiten vergleichen
wenn es nicht ganz genau sein muß, dann geht auch sowas (falls ich mich nicht verrechnet hab)
Delphi-Quellcode:
// Timer1.Enabled per Default auf False
Procedure TForm1.Timer1Timer(Sender: TObject); Begin Timer.Enabled := False; Showmessage(TimeToStr(Now)); Timer1.Intervall := 24*60*1000 - (Trunc(Now * 24*60*1000) - Trunc(Now * 24)*60*1000); Timer1.Enabled := True; End; // Timer das erste Mal starten Timer1.Intervall := 24*60*1000 - (Trunc(Now * 24*60*1000) - Trunc(Now * 24)*60*1000); Timer1.Enabled := True; ohne langsamen StrToTime und etwas langsameren DecodeTime
Delphi-Quellcode:
Var LastTime: Integer; // 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) >= 0.25{6:00}) and (Frac(Time) < 0.8{19:12}) and (Trunc(Time * 24) > LastTime) Then Begin LastTime := Trunc(Time * 24); Showmessage(TimeToStr(Time)); End; End; // und nicht vergessen LastTime zu initalisieren // LastTime := 0; // // ist es aber in Private von TForm1 deklariert, // dann ist es automatisch schon initialisiert |
Re: Uhrzeiten vergleichen
Hallo,
DeddyH hat den richtigen Tip. Merke dir einfach, das das Ereignis für eine bestimmte Stunde schon gefeuert hatte in einer Liste. Dann kannst du sogar sowas wie " + 2 Minuten ist auch noch OK" einbauen. Heiko |
Re: Uhrzeiten vergleichen
Hallo Zusammen,
vielen Dank für die vielen guten Antworten! Ich muss gestehen, dass ich die Berechnung der Zeiten nicht ganz verstehe - ich hatte noch nie damit zu tun... Was haltet ihr denn davon:
Delphi-Quellcode:
Damit habe ich meinen Timerintervall auf 1h festgelegt (ich muss mir also nicht mehr merken, ob schon eine Aktualisierung in der aktuellen Stunde durchgeführt wurde), aber eventuelle Verzögerungen werden durch die Minutentoleranz wieder abgefangen.
procedure TForm1.Timer1Timer(Sender: TObject);
var aHour,aMin,aSec,aMSec: Word; begin Timer1.Interval:=3600000; Label1.Caption := TimeToStr(Time); DecodeTime(now,aHour,aMin,aSec,aMSec); if (aHour in [6..19]) and (aMin in [0..10]) then ShowMessage('Volle Stunde'); if (aHour = 5) and (aMin in [0..10]) then //Damit, wenn das Programm sehr lange begin //läuft, ich nicht irgendwann durch Timer2.Enabled:=true; //sehr sehr viele Hänger aus dem Timer1.Enabled:=false; //10 Minutenfenster falle... end; end; Und damit das Programm nicht immer nur in den ersten 10 Minuten einer Stunde gestartet werden sollte, schicke ich das vorab:
Delphi-Quellcode:
Wie ist eure Meinung dazu?
procedure TForm1.Timer2Timer(Sender: TObject);
var aHour,aMin,aSec,aMSec: Word; begin Timer2.Interval:=1000; Label1.Caption := TimeToStr(Time); Timer1.Enabled:=false; DecodeTime(now,aHour,aMin,aSec,aMSec); if (aMin in [0..5]) then //Wird ja nach dem ersten Durchlaufen der begin //IF-Schleife abgeschlatet... Timer1.Enabled:=true; Timer2.Enabled:=false; showmessage('Timer2 false'); end; end; Danke |
Re: Uhrzeiten vergleichen
Hatte hier noch einmal alles gepostet, bevor ich den edit-Button gefunden hatte... :wall: :cheers:
|
AW: Re: Uhrzeiten vergleichen
Zitat:
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
Var Time,LastTime: TDateTime; begin If (Frac(Time) <= StrToTime('06:00:00')) and (Frac(Time) > StrToTime('14:00:00')) Then LastTime := now; edit1.Text:= 'Frühschicht'; If (Frac(Time) <= StrToTime('14:00:01')) and (Frac(Time) > StrToTime('22:00:00')) Then edit1.Text:= 'Spätschicht'; LastTime := Now ; end; end. |
AW: Re: Uhrzeiten vergleichen
Zitat:
Delphi-Quellcode:
, bzw. umgestellt
If (x <= 6) and (x > 14)
Delphi-Quellcode:
(6 >= x > 14)
If (6 >= x) and (x > 14)
Lösung: Also entweder ODER oder du müsstest die Vergleichsoperatoren umdrehen. PS: Schau auch mal in die neue DateUtils. ![]() ![]() ![]() |
AW: Uhrzeiten vergleichen
Erst mal formatieren, dann schauen, dann denken
Delphi-Quellcode:
Welchen Wert hat
procedure*TForm1.Timer1Timer(Sender: TObject);
Var* Time, LastTime: TDateTime; begin **If*(Frac(Time) <= StrToTime('06:00:00'))*and*(Frac(Time) > StrToTime('14:00:00')) **Then ****LastTime := now; edit1.Text:= 'Frühschicht'; If*(Frac(Time) <= StrToTime('14:00:01'))*and*(Frac(Time) > StrToTime('22:00:00')) **Then edit1.Text:= 'Spätschicht'; LastTime := Now ; end; end.
Delphi-Quellcode:
? - Irgendeinen, also ein Zufallsgenerator?
Time
Wofür wird
Delphi-Quellcode:
ein Wert zugeordnet? Für nix.
LastTime
Ich würde es mal damit probieren
Delphi-Quellcode:
Verwenden dann so
function GetShiftNameFromTime ( ATime : TTime ): string;
var LTime : TTime; begin LTime := Frac ( ATime ); if LTime < EncodeTime ( 6, 0, 0 ) then Result := 'Nachtschicht' else if LTime < EncodeTime ( 14, 0, 0 ) then Result := 'Frühschicht' else if LTime < EncodeTime ( 22, 0, 0 ) then Result := 'Spätschicht' else Result := 'Nachtschicht'; end;
Delphi-Quellcode:
procedure TForm1.Timer1Timer ( Sender : TObject );
begin Edit1.Text := GetShiftNameFromTime ( Now ); end; |
AW: Uhrzeiten vergleichen
Danke an euch beiden.sobald ich von der Arbeit komme werde ich es genauer studieren und testen.
|
AW: Uhrzeiten vergleichen
mal ein Alternativvorschlag ,
anstatt die Zeiten zu vergleichen , prüf doch einfach wies spät ist es, wann ist die nächste Aktion fällig und setzt den Timer auf die Differenz |
AW: Uhrzeiten vergleichen
Den Stundenwechsel kann man einfach so erfassen:
Delphi-Quellcode:
procedure TForm1.Button5Click(Sender: TObject);
var aHour,aMin,aSec,aMSec: Word; begin repeat Label1.Caption := TimeToStr(Time); DecodeTime(now,aHour,aMin,aSec,aMSec); sleep(1000); until (aHour in [6..19]) and (aMin = 0); Winapi.Windows.Beep(1500,200); // ----ab hier ACTION ! end; |
AW: Uhrzeiten vergleichen
Oder so:
Delphi-Quellcode:
Const
SixAM = 6/24; SevenPM=19/24; var theTime : Double; begin theTime := Fract(Now); if (theTime >= sixAM) and (theTime <=SevenPM) then ShowMessage('Es ist irgendwann zwischen 06:00 und 19:00'); |
AW: Uhrzeiten vergleichen
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
es sollte aber zwischen 6:00-14:00, 14:01-22:00, 22:01-6:00 unterscheiden. |
AW: Uhrzeiten vergleichen
Ein Blick in die Doku
![]() Kein Wunder, dass Emba sich damit Zeit lässt, denn gefühlt schaut da niemand rein. Und nein es wird nicht exakt auf den Zeitpunkt geprüft, sondern in welchem Bereich der übergebene Zeitpunkt liegt.
Code:
Ach ja, der Timer prüft gar nichts, sondern der sorgt nur dafür, dass das Edit-Control die Schicht-Bezeichnung zur aktuellen Uhrzeit bekommt. Oder was heisst wohl GetShiftNameFromTime? Wenn man das noch sprechender gestalten will, dann benötigt man wohl zusätzliche externe Hardware (Holzhammer) ;)
Wenn Vor 06:00 dann Nachtschicht
Sonst Wenn Vor 14:00 dann Frühschicht Sonst Wenn Vor 22:00 dann Spätschicht Sonst Nachtschicht |
AW: Uhrzeiten vergleichen
Danke, dank deiner Link habe ich gesehen das die Millisekunde gefehlt hat, eingetragen schon lief alles wie es soll.
Nur das mit dem Strg+click funktioniert nicht, sobald ich auf dem Code draufgehe und Strg+Click passiert bei mir nichts. Es soll so wie ich verstanden habe mir die Doku öffnen für das passende Befehl. |
AW: Uhrzeiten vergleichen
Mit gedrückter STRG Taste auf das Wort klicken und es öffnet sich die Unit und der Cursor steht direkt im Quelltext auf der Definition. Man kann also sofort sehen, wie das deklariert ist und was da genau passiert.
|
AW: Uhrzeiten vergleichen
In der Starter gibt es keine RTL/VCL-Quellcodes,
aber das Help-Insight gibt es hoffentlich (Mauszeiger 'nen paar Sekunden über den Befehl halten) und natürlich das F1. :roll: Im Debugger fehlt das Insight "Wert der Variable anzeigen" im Starter, so wie vieles Andere ebenfalls. |
AW: Uhrzeiten vergleichen
Danke an euch allen, ja mit Starter hat es wie du sagtest mit Befehl auswählen und f1 drücken geklappt :) habe heute vieles gelernt.
|
AW: Uhrzeiten vergleichen
Habe mal etwas experimentiert, aber eins verstehe ich nicht (obwohl es klappt) im Doku steht
Code:
Wenn ich h=23 einstelle bekomme ich 23:xx falsches Wert wenn ich aber h=24 eingebe funktioniert es.
EncodeTime codiert die angegebenen Werte für Stunde, Minute, Sekunde und Millisekunde in einen Wert des Typs TDateTime.
[B]Für Hour sind Werte von 0 bis 23 zulässig.[/B] Die gültigen Werte für Min und Sec liegen zwischen 0 und 59. Die gültigen Werte für MSec liegen zwischen 0 und 999.
Delphi-Quellcode:
function GetShiftNameFromTime ( ATime : TTime ): string;
var LTime : TTime; begin LTime := Frac ( ATime ); if LTime < EncodeTime ( 6, 0, 0, 0 ) then Result := 'Nachtscicht' else if LTime < EncodeTime ( 14, 0, 0, 0 ) then Result := 'Frühschicht' else if LTime < EncodeTime ( 22, 0, 0, 0 ) then Result := 'Spätschicht' else Result := 'Nachtschicht'; end; procedure TForm1.Timer1Timer(Sender: TObject); begin Edit1.Text := GetShiftNameFromTime ( Now ); end; procedure TForm1.Timer2Timer(Sender: TObject); var h, m, s, ms: Word; begin DecodeTime(Time, h, m, s, ms); if (h >= 6) and (h< 24) then edit2.Text:=DateToStr(now) else edit2.Text:=DateToStr(now -1); end; end. |
AW: Uhrzeiten vergleichen
:wiejetzt:
Wo geht was nicht, wo hast du
Delphi-Quellcode:
mit h=23?
EncodeTime
|
AW: Uhrzeiten vergleichen
Zitat:
Ich habe es auch falsch formuliert, wenn die Zeit zwischen 22:00 bis 6:00 ist ist es Nachtschicht. Angenommen Heute haben wir 20.10.2014 ,ab 0:00Uhr wird es 21.10.2014 es soll aber erst ab 6:00 21.10.2014 werden weil von 0:00-6:00 noch zur Nachtschicht gehört. deswegen habe ich es so eingestellt zwischen 6:00-24:00 eingegeben. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:32 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