Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Rechnen mit Zeitwerten
Mike19 - Di 15.03.11 11:02
Titel: Rechnen mit Zeitwerten
Hallo Gemeinde,
hab mal wieder eine Frage.
Über 2 Maskedit werden Zeiten im Format hh:mm eingelesen. Wie kann ich nun die Diifferenz der beiden Werte berechnen und in einem Label, oder Maskedit wieder ausgeben.
Ich stehe hier auf dem Schlauch.
Danke
Regan - Di 15.03.11 11:03
Dir könnten hier die Funktionen StrToDate oder StrToDateTime helfen. Mit diesen kannst du dann weiterrechnen.
ALF - Di 15.03.11 11:15
Glaube StrToTime geht auch. Mit der Funktion MinutesBetween erhälts du die differenz der beiden Zeitwerte.
Alf
Mike19 - Di 15.03.11 11:21
Danke, es lag am Formatierungsstring der Ausgabe. Manchmal ist eben Luft im Kopf.
Mike19 - Fr 18.03.11 11:57
Nun die nächste Frage dazu.
Wie kann ich bei Berechnungen mit diesen Timewerten Rundungsfehler ausschliesen.
Beispiel
garz:=StrToTime(Maskedit74.Text)-StrToTime(Maskedit1.Text);
ergibt bei 14:30 - 06:00 =08:29, müsste aber doch 08:30 sein ?
Gerd Kayser - Fr 18.03.11 12:15
Mike19 hat folgendes geschrieben : |
| Wie kann ich bei Berechnungen mit diesen Timewerten Rundungsfehler ausschliesen. |
Rechne in Minuten um und arbeite dann damit. Stichworte: DecodeTime und EncodeTime
Pepp3r - Fr 18.03.11 15:38
Schreib eine funktion
Delphi-Quelltext
1:
| function GetZeitDifferenz(zeit1, zeit2: Time): String |
in der du Stunden/Minuten/Sekunden aus der Uhrzeit parst. Dann kannst du die differenz errechenen, zusammensetzen und ausgeben.
---
Moderiert von
Narses: Beiträge zusammengefasst---
So zum Beispiel:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Mask;
type TForm1 = class(TForm) MaskEdit1: TMaskEdit; MaskEdit2: TMaskEdit; Label1: TLabel; procedure FormCreate(Sender: TObject); function GetZeitDif(zeit1, zeit2: TTime): String; private public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin MaskEdit1.Text := TimeToStr(Time); MaskEdit2.Text := TimeToStr(Time); Label1.Caption := GetZeitDif(Time,Time) end;
function TForm1.GetZeitDif(zeit1, zeit2: TTime): String; var a, b, c: String; i: Word; arr: Array of Integer; begin a := TimeToStr(zeit1); b := TimeToStr(zeit2);
setLength(arr, 3);
arr[0] := StrToInt(a[1]+a[2])-StrToInt(b[1]+b[2]); arr[1] := StrToInt(a[4]+a[5])-StrToInt(b[4]+b[5]); arr[2] := StrToInt(a[7]+a[8])-StrToInt(b[7]+b[8]);
c := IntToStr(arr[0])+':'+IntToStr(arr[1])+':'+IntToStr(arr[2]);
result := c;
end;
end. |
Gerd Kayser - Fr 18.03.11 18:44
Pepp3r hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5:
| arr[0] := StrToInt(a[1]+a[2])-StrToInt(b[1]+b[2]); arr[1] := StrToInt(a[4]+a[5])-StrToInt(b[4]+b[5]); arr[2] := StrToInt(a[7]+a[8])-StrToInt(b[7]+b[8]);
c := IntToStr(arr[0])+':'+IntToStr(arr[1])+':'+IntToStr(arr[2]); | |
Na, dann rechne mal mit folgenden Werten:
Delphi-Quelltext
1: 2:
| a := '01:37:02'; b := '00:58:19'; |
Pepp3r - Fr 18.03.11 20:13
Moderiert von
Narses: Komplett-Zitat des letzten Beitrags entfernt.
ich weiß nicht genau worauf du hinaus willst, aber ich glaube du meinst, dass nicht die richtige zeit-differenz errechnet wird. war auch nich von mit beabsichtigt, der author hat nur nach einer differenz gefragt.
aber auch dieses problem wäre ein leichtes zu lösen.
Gerd Kayser - Fr 18.03.11 20:42
Pepp3r hat folgendes geschrieben : |
| der author hat nur nach einer differenz gefragt. |
Die Frage, was
Mike19 mit Differenz gemeint hatte, ist doch eindeutig. Siehe seinen Beitrag von heute 10:57 Uhr.
So würde ich es machen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32:
| procedure TMainform.Button2Click(Sender: TObject); var a : string; b : string; Zeit1 : TTime; Zeit2 : TTime; Std : Word; Min : Word; Sek : Word; MSek : Word; Sekunden : Integer; begin a := '01:37:02'; b := '00:58:19'; Zeit1 := StrToTime(a); Zeit2 := StrToTime(b);
DecodeTime(Zeit1, Std, Min, Sek, MSek); Sekunden := (Std * 3600) + (Min * 60) + Sek; DecodeTime(Zeit2, Std, Min, Sek, MSek); Sekunden := Sekunden - ((Std * 3600) + (Min * 60) + Sek); Std := Sekunden div 3600; Min := (Sekunden - (Std * 3600)) div 60; Sek := Sekunden - (Min * 60); Zeit1 := EncodeTime(Std, Min, Sek, 0); Edit1.Text := TimeToStr(Zeit1); end; |
Man kann das ganze noch optimieren (z. B. TDatetime verwenden, eine Funktion daraus machen usw.). Das überlasse ich aber Euch.
Mike19 - So 20.03.11 10:33
Danke Gerd, klappt wunderbar.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!