![]() |
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 ;) |
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. |
Re: Differenz zwischen zwei Zeitwerten im Format 'hh:nn:ss'
Zitat:
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:
Wenn Sekunden > 59 springts natürlich nicht mehr auf 0 zurück ...
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; Aber danke für deine Hilfe ... werd halt noch basteln dass ich die Werte überprüfe und dann erst anzeigen lasse ;) :dp: :dancer: |
Re: Differenz zwischen zwei Zeitwerten im Format 'hh:nn:ss'
warum nicht so?
Delphi-Quellcode:
Label1.Caption := FormatDateTime('hh:nn:ss', CallStartTime-Now());
|
Re: Differenz zwischen zwei Zeitwerten im Format 'hh:nn:ss'
Zitat:
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; |
Re: Differenz zwischen zwei Zeitwerten im Format 'hh:nn:ss'
Zitat:
Nur der Vollständigkeithalber mal die Funktionen aufgeschlüsselt OnConnect
Delphi-Quellcode:
OnTimer
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;
Delphi-Quellcode:
OnDisconnect
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;
Delphi-Quellcode:
Warum kompliziert wenns auch einfach geht ;)
(*
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); Danke nochmal für die Posts Euer f4k3 |
Re: Differenz zwischen zwei Zeitwerten im Format 'hh:nn:ss'
Zitat:
Danke für die Lösung. f4k3 |
Re: Differenz zwischen zwei Zeitwerten im Format 'hh:nn:ss'
Zitat:
Delphi-Quellcode:
Die Ausgabe bei mir im Moment:
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. 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. |
Re: Differenz zwischen zwei Zeitwerten im Format 'hh:nn:ss'
Zitat:
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: |
Re: Differenz zwischen zwei Zeitwerten im Format 'hh:nn:ss'
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:12 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