AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Differenz zwischen zwei Zeitwerten im Format 'hh:nn:ss'
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von f4k3 · begonnen am 8. Jun 2009 · letzter Beitrag vom 9. Jun 2009
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von f4k3
f4k3

Registriert seit: 15. Aug 2007
Ort: Nürnberg
313 Beiträge
 
Delphi 2007 Architect
 
#1

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

  Alt 8. Jun 2009, 14:45
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

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
Sascha
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#2

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

  Alt 8. Jun 2009, 14:57
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.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von f4k3
f4k3

Registriert seit: 15. Aug 2007
Ort: Nürnberg
313 Beiträge
 
Delphi 2007 Architect
 
#3

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

  Alt 8. Jun 2009, 15:34
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 ^^

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

Sascha
  Mit Zitat antworten Zitat
Kalfany

Registriert seit: 28. Feb 2008
Ort: München
153 Beiträge
 
Delphi 2007 Professional
 
#4

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

  Alt 8. Jun 2009, 16:07
warum nicht so?
Label1.Caption := FormatDateTime('hh:nn:ss', CallStartTime-Now());
  Mit Zitat antworten Zitat
Fridolin Walther

Registriert seit: 11. Mai 2008
Ort: Kühlungsborn
446 Beiträge
 
Delphi 2009 Professional
 
#5

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

  Alt 8. Jun 2009, 16:11
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;
Fridolin Walther
  Mit Zitat antworten Zitat
Benutzerbild von f4k3
f4k3

Registriert seit: 15. Aug 2007
Ort: Nürnberg
313 Beiträge
 
Delphi 2007 Architect
 
#6

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

  Alt 8. Jun 2009, 16:16
Zitat von Kalfany:
warum nicht so?
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
Sascha
  Mit Zitat antworten Zitat
Benutzerbild von f4k3
f4k3

Registriert seit: 15. Aug 2007
Ort: Nürnberg
313 Beiträge
 
Delphi 2007 Architect
 
#7

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

  Alt 8. Jun 2009, 16:19
Zitat von 0xF30FC7:
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
Sascha
  Mit Zitat antworten Zitat
Fridolin Walther

Registriert seit: 11. Mai 2008
Ort: Kühlungsborn
446 Beiträge
 
Delphi 2009 Professional
 
#8

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

  Alt 8. Jun 2009, 16:27
Zitat von Kalfany:
warum nicht so?
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.
Fridolin Walther
  Mit Zitat antworten Zitat
Benutzerbild von f4k3
f4k3

Registriert seit: 15. Aug 2007
Ort: Nürnberg
313 Beiträge
 
Delphi 2007 Architect
 
#9

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

  Alt 8. Jun 2009, 16:47
Zitat von 0xF30FC7:
Zitat von Kalfany:
warum nicht so?
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
Sascha
  Mit Zitat antworten Zitat
guidok

Registriert seit: 28. Jun 2007
417 Beiträge
 
#10

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

  Alt 9. Jun 2009, 07:29
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...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:18 Uhr.
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