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

user profile iconMike19 hat folgendes geschrieben Zum zitierten Posting springen:
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 user profile iconNarses: 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
    { Private declarations }
  public
    { Public declarations }
  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]);

  //Falls du den Absolutbetrag brauchst:
  //c := IntToStr(Abs(arr[0]))+':'+IntToStr(Abs(arr[1]))+':'+IntToStr(Abs(arr[2]));

  result := c;

end;

end.


Gerd Kayser - Fr 18.03.11 18:44

user profile iconPepp3r hat folgendes geschrieben Zum zitierten Posting springen:

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 user profile iconNarses: 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

user profile iconPepp3r hat folgendes geschrieben Zum zitierten Posting springen:
der author hat nur nach einer differenz gefragt.
Die Frage, was user profile iconMike19 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
  // Beispielwerte setzen.
  // Bedingungen:
  //   1. Zeit1 >= Zeit2
  //   2. Zeit1 und Zeit2 < 24 Stunden
  a := '01:37:02';
  b := '00:58:19';
  Zeit1 := StrToTime(a);
  Zeit2 := StrToTime(b);

  // Berechnung Zeit1 - Zeit2
  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.