Problem mit Zeitberechnung

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Requion
Beiträge: 106
Registriert: Mi 3. Feb 2016, 09:39
OS, Lazarus, FPC: Linux(Arch Linux(+ARM)/Minibian) (L 1.6.0 FPC 3.0.0)
CPU-Target: 32/64Bit,ARM(RPi)
Wohnort: nahe Grimma

Problem mit Zeitberechnung

Beitrag von Requion »

Hallo,

ich steh gerade seit über einer Stunde mit beiden Füßen auf dem Schlauch.
Und zwar habe ich einen kleinen "Timer" der die aktuelle Uhrzeit weiß. Da will ich dann eine Anzahl an Minuten angeben und möchte mir dann die End Uhrzeit berechnen.
Beispiel: es ist 17:00:00 und angegeben sind 60 Minuten. Da soll der dann also 18:00:00 anzeigen.
Allerdings klappt die Berechnung nicht. Entweder ich hab als Endzeit die aktuelle oder irgendwas (ich nehme mal an da kam beim Test zu einem Overflow).

Kann mir da mal jemand einen Schubs geben wie ich das berechne?

PS: Ich hab zwar im Netz gesucht, aber nichts passendes gefunden :( Wenn jemand einen Link zu einem Beispiel hat, nehm ich auch diesen gern.
Mfg Requion

Das beste an Standards ist, dass es so viele davon gibt.

wp_xyz
Beiträge: 5134
Registriert: Fr 8. Apr 2011, 09:01

Re: Problem mit Zeitberechnung

Beitrag von wp_xyz »

Bei Zeitrechnung verwendet man üblicherweise den Typ TTime. Das ist eine ganz normale Gleitkommazahl, bei der die Zeit zwischen Mitternacht und Mitternacht des folgenden Tages auf den Bereich von 0 bis 1 abgebildet wird. 0 bedeutet Mitternacht, 0.5 ist 12:00 Mittag etc. Zur Umrechnung gibt es eine Unmenge von Funktionen in den Unit SysUtils (http://www.freepascal.org/docs-html/rtl ... tines.html) und DateUtils (http://www.freepascal.org/docs-html/rtl ... dex-5.html).

Code: Alles auswählen

var
  tAnf, tEnde: TTime;
  h1: TTime;
....
  // 17:00:00
  tAnf := EncodeTime(17, 0, 0, 0);  // Stunden, Minuten, Sekunden, Millisekunden
  // oder
  tAnf := StrToTime('17:00');
 
  // 1 Stunde
  h1 := EncodeTime(1, 0, 0, 0);  // 1 Stunde
  // oder
  h1 := 1/24;  // 1 Tag hat 24 Stunden
 
  // 1 Stunde nach 17:00
  tEnde := tAnf + h1;
  // oder
  tende := IncMinute(tanf, 60);  // 60 Minuten nach tAnf
 
  // Anzeige als String
  ShowMessage('1 Std nach 17:00 ist es: ' + TimeToStr(tEnde));
 
 
Zuletzt geändert von wp_xyz am Di 6. Sep 2016, 18:15, insgesamt 1-mal geändert.

Bitschubser
Beiträge: 61
Registriert: Mo 27. Aug 2012, 15:43

Re: Problem mit Zeitberechnung

Beitrag von Bitschubser »

Wenn man mit der Auflösung und Genauigkeit von TDateTime zufrieden ist kann man das auch mit TDateTime (wie z.B. von "Now" geliefert) erledigen.

In TdateTime ist 1,0 = 1 Tag.

Ich hab dafür ein paar Konstanten definiert:

Code: Alles auswählen

 
  Hours     : TDateTime                     = 1 / 24;
  Minutes   : TDateTime                     = 1 / 24 / 60;
  Seconds   : TDateTime                     = 1 / 24 / 60 / 60;
  Hundreds  : TDateTime                     = 1 / 24 / 60 / 60 / 100;
  Millisecs : TDateTime                     = 1 / 24 / 60 / 60 / 1000;
 
und dann geht z.B.

Code: Alles auswählen

 
EndZeit := Now + 1 * Hours;
 

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2805
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Problem mit Zeitberechnung

Beitrag von m.fuchs »

Darf ich mal auf die Unit DateUtils (http://www.freepascal.org/docs-html/rtl ... dex-5.html) verweisen? Im Speziellen auf IncMinute (http://www.freepascal.org/docs-html/rtl ... inute.html).
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Requion
Beiträge: 106
Registriert: Mi 3. Feb 2016, 09:39
OS, Lazarus, FPC: Linux(Arch Linux(+ARM)/Minibian) (L 1.6.0 FPC 3.0.0)
CPU-Target: 32/64Bit,ARM(RPi)
Wohnort: nahe Grimma

Re: Problem mit Zeitberechnung

Beitrag von Requion »

Danke an euch, jetzt funktionierts.

Habs dann jetzt mit IncMinute gemacht. Danke @m.fuchs.
Mfg Requion

Das beste an Standards ist, dass es so viele davon gibt.

Antworten