Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Differenz zwischen zwei Zeitwerten im Format 'hh:nn:ss' (https://www.delphipraxis.net/135281-differenz-zwischen-zwei-zeitwerten-im-format-hh-nn-ss.html)

f4k3 8. Jun 2009 13:45


Differenz zwischen zwei Zeitwerten im Format 'hh:nn:ss'
 
Moin Moin liebe DP'ler ;)

Ich hab folgendes Problem ...

Ich steuer mittels der hbTapi Components ein am PC angeschlossenes Telefon an.
Wenn nun ein Anruf auf der Leitung ist, wird in ein neuer "Call" in der Komponente angelegt.
Dieser Call hat nun Informationen über den Anruf.

Die Informationen die ich benötige um die aktuelle Gesprächdauer zu ermitteln steht in der Property "Begin Time" die den Zeitwert enthält, der gesetzt wurde, als zwischen den zwei Gesprächspartnern eine aktive Verbindung hergestellt wurde.
Sprich seit der angerufene den Hörer abgenommen hat :P

Den aktuellen Zeitwert könnte ich mit "Now" ermitteln und mir eine Funktion schreiben die mir die Differenz ausrechnet.

Die einzigste Lösung die mir momentan einfällt, ist ein Timer und diesen alle 1000 ms auszuführen und die Anzeige somit
zu aktualisieren.
Nur leider ist mir bekannt dass der Timer immer wieder schwierigkeiten macht z.B. wenn das Formular gezogen wird oder
die CPU ausgelastet ist.

Die Daten müssen aber korrekt sein, weil dass ganze erstens für eine korrekte Anzeige sorgen soll und die Werte
nach dem Auflegen in einer Datenbank gespeichert werden. Mittels dieser Werte könnte eine aussagekräftige
Statistik erstellt werden. Z.b. über die durchschnittliche Abwicklung eines Supportanrufs.

Die hbTapi Components liefern leider keine Methode dafür. Und es gibt auch kein Event dass während eines
Anrufs immer wieder aufgerufen wird.

Wie im Titel bereits beschrieben brauche ich die Differenz im Format "Stunden:Minuten:Sekunden" als String.

Die Dauer des Gesprächs zu errechnen, wenn der Anruf beendet wurde wäre wiederum kein Problem ... weil die Komponente
die genannte "BeginTime" sowie eine "EndTime" vom Typ TDateTime speichert.

Ich brauch einfach nur eine Funktion mit der ich mir die Differenz errechnen könnten und im String format zurückgeben lassen könnte. Und eben eine Alternative für einen Timer ...

Danke für eure Hilfe

Euer f4k3 ;)

jaenicke 8. Jun 2009 13:57

Re: Differenz zwischen zwei Zeitwerten im Format 'hh:nn:ss'
 
Ein Timer wird ggf. ein paar Sekunden nicht ausgeführt, das ändert aber an der Genauigkeit deiner Differenzberechnung ja nichts. Soll der Timer auch unabhängig von der Oberfläche weiterlaufen, dann bleibt nur ein Thread, aber ich sehe darin keinen Sinn.

Die Differenz kannst du einfach mit MinutesBetween etc, aus der Unit DateUtils berechnen.

f4k3 8. Jun 2009 14:34

Re: Differenz zwischen zwei Zeitwerten im Format 'hh:nn:ss'
 
Zitat:

Zitat von jaenicke
Ein Timer wird ggf. ein paar Sekunden nicht ausgeführt, das ändert aber an der Genauigkeit deiner Differenzberechnung ja nichts. Soll der Timer auch unabhängig von der Oberfläche weiterlaufen, dann bleibt nur ein Thread, aber ich sehe darin keinen Sinn.

Die Differenz kannst du einfach mit MinutesBetween etc, aus der Unit DateUtils berechnen.

mhm ... Also die Funktionen sind nicht schlecht ... aber müsst ich dann nicht auch ...
  • HoursBetween()
  • MinutesBetween()
  • SecondsBetween()
ausführen?

Wie gesagt ich brauch die Stunden, Minuten und Sekunden.

MinutesBetween liefert ja nur die Anzahl der Minuten ^^ :P

Außerdem hab ich dann für die Anzeige n Problem ... wenn ichs so mache ...
Delphi-Quellcode:
procedure TfrmMain.timElapsedTimeTimer(Sender: TObject);
begin
  (*
    Autor: Sascha Katzenberger
    Datum: 2009-06-08

    Beschreibung:
    Während der Timer läuft, sollen die Stunden, Minuten und Sekunden
    seit Anrufbeginn ermittelt werden. Da nur ein Anruf gleichzeitig
    im State "Connect" ist, wird jeweils auch nur der aktuelle Anruf
    bearbeitet. Entsprechendes Execptionhandling ist also nicht notwendig.
  *)
 
  // Stunden seit ...
  frmCallMonitor.lblElapsedTime_Hours.Caption := IntToStr(HoursBetween(CallStartTime, Now));                                              
  // Minuten seit ...
  frmCallMonitor.lblElapsedTime_Minutes.Caption := IntToStr(MinutesBetween(CallStartTime, Now));
  // Sekunden seit ...
  frmCallMonitor.lblElapsedTime_Seconds.Caption := IntToStr(SecondsBetween(CallStartTime, Now));
end;
Wenn Sekunden > 59 springts natürlich nicht mehr auf 0 zurück ...

Aber danke für deine Hilfe ... werd halt noch basteln dass ich die Werte überprüfe und dann erst anzeigen lasse ;)

:dp: :dancer:

Kalfany 8. Jun 2009 15:07

Re: Differenz zwischen zwei Zeitwerten im Format 'hh:nn:ss'
 
warum nicht so?
Delphi-Quellcode:
Label1.Caption := FormatDateTime('hh:nn:ss', CallStartTime-Now());

Fridolin Walther 8. Jun 2009 15:11

Re: Differenz zwischen zwei Zeitwerten im Format 'hh:nn:ss'
 
Zitat:

Zitat von f4k3
mhm ... Also die Funktionen sind nicht schlecht ... aber müsst ich dann nicht auch ...
  • HoursBetween()
  • MinutesBetween()
  • SecondsBetween()
ausführen?

Nein, weil Du die zeitliche Differenz in Sekunden erhälst. Wenn also zw. Start- und Endzeit eine Stunde liegt, liefert die Funktion z.B. 3600 zurück. Mit den Sekunden kannst Du dann aber trivial die von Dir benötigten Werte errechnen:
Delphi-Quellcode:
function GetTimeDifferenceAsString(StartTime, EndTime : TDateTime) : string;
var
  TimeDifferenceInSeconds : Integer;
begin
  TimeDifferenceInSeconds := SecondsBetween(EndTime, StartTime);
  Result := Format('%.2d:%.2d:%.2d',
    [TimeDifferenceInSeconds div 3600,
     TimeDifferenceInSeconds mod 3600 div 60,
     TimeDifferenceInSeconds mod 60]);
end;

f4k3 8. Jun 2009 15:16

Re: Differenz zwischen zwei Zeitwerten im Format 'hh:nn:ss'
 
Zitat:

Zitat von Kalfany
warum nicht so?
Delphi-Quellcode:
Label1.Caption := FormatDateTime('hh:nn:ss', CallStartTime-Now());

lol ... warum nicht so xD ... Danke is genau das was ich gesucht hab ;)

Nur der Vollständigkeithalber mal die Funktionen aufgeschlüsselt

OnConnect
Delphi-Quellcode:
procedure TfrmMain.hbLineConnected(Sender: ThbTapiLine; Call: ThbTapiCall);
begin
  (*
    Autor: Sascha Katzenberger
    Datum: 2009-06-08

    Beschreibung:
    Gesprächsdauer anzeigen und Timer starten der Gesprächsdauer ermittelt
    (TimElapsedTime).
  *)
  // Startzeit in Variable "CallStartTime" zwischenspeichern.
  CallStartTime := Call.BeginTime;

  // Gesprächdaueranzeige anzeigen
  SetElapsed(True);

  // "TimElapsedTime" aktivieren
  timElapsedTime.Enabled := True;
end;
OnTimer
Delphi-Quellcode:
procedure TfrmMain.timElapsedTimeTimer(Sender: TObject);
var
  Time: TDateTime;
begin
  (*
    Autor: Sascha Katzenberger
    Datum: 2009-06-08

    Beschreibung:
    Während der Timer läuft, sollen die Stunden, Minuten und Sekunden
    seit Anrufbeginn ermittelt werden. Da nur ein Anruf gleichzeitig
    im State "Connect" ist, wird jeweils auch nur der aktuelle Anruf
    bearbeitet. Entsprechendes Execptionhandling ist also nicht notwendig.
  *)

  // Stunden ermitteln
  //Time := hbLine.Calls[0].BeginTime - hbLine.Calls[0].ConnectTime;

  frmCallMonitor.lblElapsedTime_View.Caption := FormatDateTime('hh:nn:ss', CallStartTime - Now);
end;
OnDisconnect
Delphi-Quellcode:
(*
    Autor: Sascha Katzenberger
    Datum: 2009-06-08

    Beschreibung:
    Der Timer muss wieder deaktiviert werden und die Gesprächsdauer Anzeige
    muss ausgeblendet werden.  
  *)
 
  timElapsedTime.Enabled := False;
  // Gesprächsdaueranzeige ausblenden
  SetElapsed(False);
Warum kompliziert wenns auch einfach geht ;)

Danke nochmal für die Posts

Euer f4k3

f4k3 8. Jun 2009 15:19

Re: Differenz zwischen zwei Zeitwerten im Format 'hh:nn:ss'
 
Zitat:

Zitat von 0xF30FC7
Zitat:

Zitat von f4k3
mhm ... Also die Funktionen sind nicht schlecht ... aber müsst ich dann nicht auch ...
  • HoursBetween()
  • MinutesBetween()
  • SecondsBetween()
ausführen?

Nein, weil Du die zeitliche Differenz in Sekunden erhälst. Wenn also zw. Start- und Endzeit eine Stunde liegt, liefert die Funktion z.B. 3600 zurück. Mit den Sekunden kannst Du dann aber trivial die von Dir benötigten Werte errechnen:
Delphi-Quellcode:
function GetTimeDifferenceAsString(StartTime, EndTime : TDateTime) : string;
var
  TimeDifferenceInSeconds : Integer;
begin
  TimeDifferenceInSeconds := SecondsBetween(EndTime, StartTime);
  Result := Format('%.2d:%.2d:%.2d',
    [TimeDifferenceInSeconds div 3600,
     TimeDifferenceInSeconds mod 3600 div 60,
     TimeDifferenceInSeconds mod 60]);
end;

Habs mal ausprobiert geht auch ;)
Danke für die Lösung.

f4k3

Fridolin Walther 8. Jun 2009 15:27

Re: Differenz zwischen zwei Zeitwerten im Format 'hh:nn:ss'
 
Zitat:

Zitat von Kalfany
warum nicht so?
Delphi-Quellcode:
Label1.Caption := FormatDateTime('hh:nn:ss', CallStartTime-Now());

Ganz einfach ... weil die Zeit dann nach 24h von vorne beginnt ;).
Delphi-Quellcode:
program Project2;

{$APPTYPE CONSOLE}

uses
  DateUtils, SysUtils;

function GetTimeDifferenceAsString(StartTime, EndTime : TDateTime) : string;
var
  TimeDifferenceInSeconds : Integer;
begin
  TimeDifferenceInSeconds := SecondsBetween(EndTime, StartTime);
  Result := Format('%.2d:%.2d:%.2d',
    [TimeDifferenceInSeconds div 3600,
     TimeDifferenceInSeconds mod 3600 div 60,
     TimeDifferenceInSeconds mod 60]);
end;


begin
  writeln(GetTimeDifferenceAsString(Yesterday, Now));
  writeln(FormatDateTime('hh:nn:ss', Yesterday - Now));
  readln;
end.
Die Ausgabe bei mir im Moment:
40:24:08
16:24:08

Sobald ein Telefonat also länger als 24h dauert, wäre die Anzeige nicht korrekt. Ist für die Implementation hier evtl. nicht ganz so wichtig, aber irgendwann haben Informatiker auch mal gedacht 2 Byte reicht aus um das Jahr zu speichern ... .

EDIT:
Es gibt übrigens auch noch einen Sonderfall, den Du behandeln solltest. Und zwar die Zeitumstellung. Da kann es durchaus passieren, daß die Endzeit vor der Startzeit liegt.

f4k3 8. Jun 2009 15:47

Re: Differenz zwischen zwei Zeitwerten im Format 'hh:nn:ss'
 
Zitat:

Zitat von 0xF30FC7
Zitat:

Zitat von Kalfany
warum nicht so?
Delphi-Quellcode:
Label1.Caption := FormatDateTime('hh:nn:ss', CallStartTime-Now());

Ganz einfach ... weil die Zeit dann nach 24h von vorne beginnt ;).
Delphi-Quellcode:
program Project2;

{$APPTYPE CONSOLE}

uses
  DateUtils, SysUtils;

function GetTimeDifferenceAsString(StartTime, EndTime : TDateTime) : string;
var
  TimeDifferenceInSeconds : Integer;
begin
  TimeDifferenceInSeconds := SecondsBetween(EndTime, StartTime);
  Result := Format('%.2d:%.2d:%.2d',
    [TimeDifferenceInSeconds div 3600,
     TimeDifferenceInSeconds mod 3600 div 60,
     TimeDifferenceInSeconds mod 60]);
end;


begin
  writeln(GetTimeDifferenceAsString(Yesterday, Now));
  writeln(FormatDateTime('hh:nn:ss', Yesterday - Now));
  readln;
end.
Die Ausgabe bei mir im Moment:
40:24:08
16:24:08

Sobald ein Telefonat also länger als 24h dauert, wäre die Anzeige nicht korrekt. Ist für die Implementation hier evtl. nicht ganz so wichtig, aber irgendwann haben Informatiker auch mal gedacht 2 Byte reicht aus um das Jahr zu speichern ... .

EDIT:
Es gibt übrigens auch noch einen Sonderfall, den Du behandeln solltest. Und zwar die Zeitumstellung. Da kann es durchaus passieren, daß die Endzeit vor der Startzeit liegt.

mhm ... Also ein Supportanruf der länger als 24h Stunden dauert ist inakzeptabel für Anwender und Supportfirma und meines erachtens wird es in der Praxis nicht vorkommen.

Also für meine Zwecke brauche ich den Fall der Zeitumstellung nicht berücksichtigen, weil der Support nicht zwischen 2 oder 3 Uhr in der Nacht nicht aktiv ist.

Deine Anmerkungen sind zweifellos korrekt und danke für den Hinweis.

Aber für mein Vorhaben wäre dies wohl zuviel des guten ;)

MfG f4k3 ;) :dp:

guidok 9. Jun 2009 06:29

Re: Differenz zwischen zwei Zeitwerten im Format 'hh:nn:ss'
 
Zitat:

Zitat von 0xF30FC7
Ganz einfach ... weil die Zeit dann nach 24h von vorne beginnt ;).

Now() ist doch vom Format TDateTime, d.h. da ist auch das Datum drin gespeichert. Demnach sollte es egal sein, ob 24h oder 24Tage dazwischen liegen...


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:49 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz