AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zeitdifferenz bzw. dauer berechnen

Ein Thema von Stecky2000 · begonnen am 24. Aug 2012 · letzter Beitrag vom 24. Aug 2012
Antwort Antwort
Seite 1 von 2  1 2      
Stecky2000

Registriert seit: 7. Mai 2008
Ort: Trebur
66 Beiträge
 
Delphi 2010 Professional
 
#1

Zeitdifferenz bzw. dauer berechnen

  Alt 24. Aug 2012, 08:43
Hallo allerseit,

ich muss mal vorausschicken, dass ich zwar schon lange hier und da was mit Delphi programmiere aber nicht annähernd ein Profi bin. Ich hab ein Tool programmiert um Dienstpläne zu bearbeiten.

Dabei gibt es in einem StringGrid/Edit-Feld Stringeingaben von Uhrzeiten:
Z.B.
Start: 06:00
Ende: 12:00

Und eine Berechnung:

Ende - Start = Dauer 6,0

Das funktioniert auch.
Dazu habe ich eine Formel die Lautet:

Wenn Dauer > 6 dann ziehe 0,5 ab (Arbeitszeitgesetzt, Arbeit über 6 Stunden eine halbe Stunde abziehen), auch das funktioniert.

Jetzt bin ich gestern auf ein seltsames phänomen gestoßen:

Wenn ich eingebe
Start: 06:00
Ende: 12:00
Bekomme ich als Ergebnis der Daur 6,0.....also okay

Wenn ich eingebe
Start: 05:00
Ende: 11:00
Bekomme ich als Ergebnis der Daur 6,0.....also auch okay

Wenn ich aber eingebe
Start: 04:00
Ende: 10:00
Bekomme ich als Ergebnis der Daur 5,5.....????!!


Ich verstehe nicht warum! Ich gebe ja als String ein: 04:00 und 10:00, keine Minute mehr oder weniger.
Trotzdem sagt die Formel
wenn Dauer > 6 dann 0,5 abziehen
dass dauer größer 6 ist.


Kann mir jemand sagen was ich falsch mache oder wie ich das verhindern kann?

Ich könnte einfach eingeben
Wenn dauer > 6,000xxx für 06:00:59 (Sekunden) aber die richtige Lösung ist das wohl nicht.


Ich hoffe Ihr könnt mir helfen.
Hier ein wenig code (bitte nicht lachen)

Delphi-Quellcode:
 
t1 := StrToTime(StringGrid3.Cells[3, i]);
t2 := StrToTime(StringGrid3.Cells[4, i]);
d := (t2-t1)*1440/60;

If RadioGroup6.ItemIndex <> 4 then
begin
if (d > 6.001) then
d := d - 0.5;
end;

StringGrid3.Cells[2, i] := FloatToStr(d);
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Zeitdifferenz bzw. dauer berechnen

  Alt 24. Aug 2012, 08:50
Ich vermute, dass es sich um Ungenauigkeiten im Zusammenhang mit Fließkommazahlen handelt. Geht es besser, wenn Du zunächst die Zeiten dekodierst und dann die resultierenden Ganzzahlen vergleichst? IIRC gab es unter Delphi 5 ja noch keine DateUtils, ansonsten hätte ich zu SecondsBetween geraten.

[edit] Achja, hast Du Dir den Vorkommaanteil (also das Datum) einmal im Debugger angesehen? Ich bin mir gerade nicht sicher, wie StrToTime den belegt. [/edit]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen

Geändert von DeddyH (24. Aug 2012 um 08:54 Uhr)
  Mit Zitat antworten Zitat
Stecky2000

Registriert seit: 7. Mai 2008
Ort: Trebur
66 Beiträge
 
Delphi 2010 Professional
 
#3

AW: Zeitdifferenz bzw. dauer berechnen

  Alt 24. Aug 2012, 09:00
Ich habe mir jetzt einfach folgendes eingebaut
Showmessage(Format('%2.18f',[d])); Das Ergebist von

Start: 04:00
Ende: 10:00
ist 6,000000000000000890 !!!
Wahrscheinlich eine Ungenauigkeit, wie Du gesagt hast.

Das bedeutet wohl dass ich wirklich schreiben muss:

Delphi-Quellcode:
if (d > 6,000000000000000890 ) then
d := d - 0.5;
end;
oder?


PS übrigens Danke für den Tipp und auch für den Hinweis mit Delphi 5
Ich werde gleich meine Sig ändern, ich habe nämlich Delphi 2010
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Zeitdifferenz bzw. dauer berechnen

  Alt 24. Aug 2012, 09:01
Wie gesagt, mein erster Gedanke ist, beide Zeiten mit Delphi-Referenz durchsuchenDecodeTime in ihre Bestandteile zu zerlegen und dann die zu vergleichen.

[edit] Bei Delphi 2010 kannst Du natürlich auf Delphi-Referenz durchsuchenDateUtils zurückgreifen, das ist wesentlicher einfacher. [/edit]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#5

AW: Zeitdifferenz bzw. dauer berechnen

  Alt 24. Aug 2012, 09:12
Für den Vergleich von Fließkommazahlen kannst die Methode CompareValue aus der Unit Math nutzen, bei der du das Epsilon angeben kannst. Zudem würde ich das Epsilon dann als Konstante definieren und so überall nutzen

Würde aber bei deinem Problem wahrlich das ganze entsprechend aufsplitten, wie DeddyH geaschrieben hat. So brauchst dir nie Gedanken über irgendwelche Fließkommazahlen bzw. dem Format von DateTime machen. Und wenn ein anderer deinen Code lesen sollte, wird es wesentlic einfach für ihn.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.157 Beiträge
 
Delphi 12 Athens
 
#6

AW: Zeitdifferenz bzw. dauer berechnen

  Alt 24. Aug 2012, 09:36
Mit 6,000000000000000890 zu vergleichen ist nicht so gut, denn bei was Anderem (z.B. 10 bis 16) könnte ein anderer Wert rauskommen.

1 Sekunde = 0,000277777777777777...
30 Sekunden = 0,00833333333333333...

Der Einfachheit halber würde ich 0,0001 (etwa eine halbe/drittel Sekunde) verwenden.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Zeitdifferenz bzw. dauer berechnen

  Alt 24. Aug 2012, 09:38
Der Einfachheit halber würde ich eher DateUtils.SecondsBetween verwenden, aber das sagte ich ja schon mehrfach
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Stecky2000

Registriert seit: 7. Mai 2008
Ort: Trebur
66 Beiträge
 
Delphi 2010 Professional
 
#8

AW: Zeitdifferenz bzw. dauer berechnen

  Alt 24. Aug 2012, 09:43
Ich habe es mit Decode versucht...
Delphi-Quellcode:
Sysutils.DecodeTime(t1, Hour, Min, Sec, MSec);
Showmessage('Beginn - Stunde: ' + IntToStr(Hour) + ' , Minute: ' + IntToStr(Min) + ' , Sekunde: ' + IntToStr(Sec) + ' , Millisekunde: ' + IntToStr(MSec));

Sysutils.DecodeTime(t2, Hour, Min, Sec, MSec);
Showmessage('Ende - Stunde: ' + IntToStr(Hour) + ' , Minute: ' + IntToStr(Min) + ' , Sekunde: ' + IntToStr(Sec) + ' , Millisekunde: ' + IntToStr(MSec));

Sysutils.DecodeTime(d, Hour, Min, Sec, MSec);
Showmessage('Dauer - Stunde: ' + IntToStr(Hour) + ' , Minute: ' + IntToStr(Min) + ' , Sekunde: ' + IntToStr(Sec) + ' , Millisekunde: ' + IntToStr(MSec));
Ergebnis 1: Beginn - Stunde: 4 , Minute: 0 , Sekiunde: 0 , Millisekunde: 0
Ergebnis 2: Ende - Stunde: 10 , Minute: 0 , Sekiunde: 0 , Millisekunde: 0
Ergebnis 3: Dauer - Stunde: 6 , Minute: 0 , Sekiunde: 0 , Millisekunde: 0


Das bedeutet, diese Ungenauigkeit wird nicht mal in Millisekunden dargestellt.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Zeitdifferenz bzw. dauer berechnen

  Alt 24. Aug 2012, 09:48
Dann wird das wohl schon funktionsintern ausgeglichen. Wer mag, kann ja einen Blick in die SysUtils.pas werfen, mir ist das aber wurscht, solange das Ergebnis stimmt
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Stecky2000

Registriert seit: 7. Mai 2008
Ort: Trebur
66 Beiträge
 
Delphi 2010 Professional
 
#10

AW: Zeitdifferenz bzw. dauer berechnen

  Alt 24. Aug 2012, 09:59
So, dann Danke an alle, speziell an DeddyH.
Ich habe es jetzt so gelöst:

Delphi-Quellcode:
d := (t2+(1.0-t1))*1440/60;
x := SecondsBetween(t2, t1);
If RadioGroup6.ItemIndex <> 4 then
begin
//if (d > 6) then
if (x > 21600) then
    d := d - 0.5;
end;
  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 19:58 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