Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Stunden/Minuten in Dezimalwerten (https://www.delphipraxis.net/90201-stunden-minuten-dezimalwerten.html)

newuser01 13. Apr 2007 10:51


Stunden/Minuten in Dezimalwerten
 
Hallo

Ich ermittle in meinem Programm die Stunden zwischen zwei Zeitangaben z.b von 09:00 bis 10:25 Als Ausgabe lass ich mir die Stunden dann in Dezimalwerten anzeigen in diesem Fall kommt also (1,41666666666667)raus. Jetzt hab ich aber 1. das Problem, wenn ich von 07:00 bis 08:00 ermittle müsste ja (1,0) rauskommen aber, es kommt (0,999999999999999) raus. Wenn ich aber von 08:00 bis 09:00 ermittle dann zeigt er mir (1,0) an also richtig, blos woran liegt das ? Kann es sein das es was mit Primzahlen zu tun hat ? weil ja die (7) eine wäre. Das 2. Problem ist das ich nur zwei stellen nach dem Komma anzeigen möchte, wie könnte ich dies lösen?


Delphi-Quellcode:
 
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
Start, Ende, Gesamt: TDateTime;
begin

 Start := StrToDateTime(eStart.Text);
 Ende := StrToDateTime(eEnde.Text);
 Gesamt:= (Ende - Start);

 eGesamt.Text := FloatToStr(24*(Gesamt)); //Dezimalausgabe

end;

mkinzler 13. Apr 2007 10:55

Re: Stunden/Minuten in Dezimalwerten
 
Nimm besser einen TDateTimePicker

uwewo 13. Apr 2007 10:56

Re: Stunden/Minuten in Dezimalwerten
 
Mit

Delphi-Quellcode:
Frac(Gesamt);
bekommst Du schon den Nachkommaanteil Deines TDateTime Wertes, diesen müsstest Du nur noch in Stunden umrechnen.

Jelly 13. Apr 2007 11:00

Re: Stunden/Minuten in Dezimalwerten
 
Zitat:

Zitat von newuser01
Das 2. Problem ist das ich nur zwei stellen nach dem Komma anzeigen möchte, wie könnte ich dies lösen?

Mit der Funktion format:

Delphi-Quellcode:
label1.caption := format('%.2f',[Gesamt*24]) ;

himitsu 13. Apr 2007 11:03

Re: Stunden/Minuten in Dezimalwerten
 
TTime/TDate/TDateTime sind eigentlich nur Double (reelle Typen)

und diese haben nunmal Rundungsfehler.


Diese kannst du dann höchstens selber entsprechend der gewünschten Auflösung auf passende Werte runden.

newuser01 13. Apr 2007 11:19

Re: Stunden/Minuten in Dezimalwerten
 
Also das mit den Kommastellen funktioniert schon mal. Ich lass aber besser 3 Stellen nach dem Komma anzeigen ist wohl nachher nach dem addieren genauer :mrgreen: oder :gruebel: Das (0,999999999999999) Problem ist damit ebenfalls gelöst, zumindest zeigt er bei 07:00 - 08:00 jetzt 1,000 an :-D


DANKE FÜE DIE HILFE !!!

himitsu 13. Apr 2007 11:24

Re: Stunden/Minuten in Dezimalwerten
 
Zitat:

Zitat von newuser01
Das (0,999999999999999) Problem ist damit ebenfalls gelöst, zumindest zeigt er bei 07:00 - 08:00 jetzt 1,000 an :-D

das Format/die FPU rundet standardmäßig auf/ab, also da funktioniert es ... falls aber jemand/etwas in deinem Programm das Rundungsverhalten der FPU umstellt, dann war's das wieder mit dem "es klapp".
Aber im Normalfall sollte es wohl klappen :angel2:

newuser01 13. Apr 2007 11:28

Re: Stunden/Minuten in Dezimalwerten
 
FPU ?


Oder wäre es besser die Zeit zwischen zwei Zeitangaben erst in reine Minuten umzurechnen und dann erst alle addieren und in Stunden (Dezimal) umrechnen ? Blos wie mach ich das :gruebel:

bigg 13. Apr 2007 11:32

Re: Stunden/Minuten in Dezimalwerten
 
moin,

es gibt in der RTL dazu viele hilfreiche Funktionen, die du verwenden könntest. Oder aber du schreibst dir selbst ein paar kleine Funktionen, die das Problem lösen.

Ich würde die beiden Daten in Sekunden umrechnen und anschließend vom größeren Wert den kleineren abziehen. Dann hast du die Differenz in Sekunden und müßtest dann lediglich von Sekunden in Minuten/Stunden umrechnen.

newuser01 13. Apr 2007 11:38

Re: Stunden/Minuten in Dezimalwerten
 
Wenn ich nur mal "Minuten" in der Delphihilfe eingebe bekomme ich zb. für "DateUtils" ein haufen "Routinen" ausgespuckt. Aubacke sich dort erstmal durchfinden :-D Na OK ich habe ja noch ein paar Jährchen Zeit :mrgreen:

himitsu 13. Apr 2007 11:40

Re: Stunden/Minuten in Dezimalwerten
 
Wenn du die werte voeher in Integer (z.B. mit minuten) umwandelst und dann damit weiterrechnest, dann kannst du zumindestens weitere Rundungsfehler (basierend auf die Fließkommazahlen) vermeiden.

FloatingPointUnit (Fließkommaeinheit) ... halt das Ding in deinem Rechner, welches mit den reellen Zahlen rechnet.

Delphi-Quellcode:
i := Round((Ende - Start) * (24*60));
//i = minuten
Delphi-Referenz durchsuchenRound rundet ja auf/ab, würde also kleine Rundungsfehler gut wegmachen und der Integer kennt derartige Rundungsfehler nicht. :)


hier mal ein "extremes" Beispiel für die Ungenauigkeiten bei reellen Typen:
(benötigt nur 2 TLabels und einen TButton)
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
  r: single;
begin
  r := 0;
  i := 0;
  repeat
    r := r + 0.0001;
    i := i + 1;
    Label1.Caption := FloatToStr(r);
    Label2.Caption := FloatToStr(i / 10000);
    Application.ProcessMessages;
  until application.Terminated;
end;

newuser01 13. Apr 2007 11:56

Re: Stunden/Minuten in Dezimalwerten
 
Ok also ist es besser erst alles in Minuten umzurechnen also zb. so


Delphi-Quellcode:
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
Start, Ende, Gesamt: TDateTime;
iTmp:Integer
begin

Start := StrToDateTime(eStart.Text); //zb. von 08:00
Ende := StrToDateTime(eEnde.Text); // bis 09:00
Gesamt:= (Ende - Start);

iTmp := Round((Gesamt) * (24*60));

eGesamt.Text := IntToStr(iTmp);

end;
Anschießend könnten alle Minuten in der Tabelle addiert werden und dann mit "Minuten/60" zu Stunden und Minuten berechnet werden seh ich das so richtig ?

Klaus01 13. Apr 2007 12:10

Re: Stunden/Minuten in Dezimalwerten
 
Du könntest auch diese Funktion aus den DateUtils verwenden:

function MinutesBetween(const ANow, AThen: TDateTime): Int64;

Delphi-Quellcode:
eGesamt.Text:=IntToStr(MinutesBetween(StrToDateTime(eStart.Text),StrToDateTime(eEnde.Text)));
Grüße
Klaus

himitsu 13. Apr 2007 12:22

Re: Stunden/Minuten in Dezimalwerten
 
jupp, wäre möglich :)


minuten := MinutesBetween(StrToDateTime(eStart.Text), StrToDateTime(eEnde.Text)));
macht och nur
minuten := Abs(Round((StrToDateTime(eEnde.Text) - StrToDateTime(eStart.Text)) * (24*60)));
und da eEnde vermutlich immer nach eStart liegt, kann das Abs entfallen.

ein div statt / erspart dir dann wiederum den weg über reelle typen.
Delphi-Quellcode:
stunden := gesamtminuten div 60;
minuten := gesamtminuten mod 60;


PS: falls du maximal 4 nachkommastellen benötigst ...
Currency ist in Wirklichkeit ein Int64 (64 Bit-Integer), nur das der automatisch (wenn es nötig ist) entsprechend umgewandelt wird, so das er wie ein fließkommatyp mit maximal 4 Nachkommastellen wirkt.

wäre bei 1.0 = 1 Tag eine Genauigkeit von 0,144 Minuten

newuser01 13. Apr 2007 12:40

Re: Stunden/Minuten in Dezimalwerten
 
Also kann ich bei dieser Methode bleiben?

Delphi-Quellcode:
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
Start, Ende, Gesamt: TDateTime;
iTmp:Integer
begin

Start := StrToDateTime(eStart.Text); //zb. von 08:00
Ende := StrToDateTime(eEnde.Text); // bis 09:00
Gesamt:= (Ende - Start);

iTmp := Round((Gesamt) * (24*60));

eGesamt.Text := IntToStr(iTmp);

end;
und anschließende Umrechnung der Gesamtminuten in Stunden mit

Delphi-Quellcode:
stunden := gesamtminuten div 60;

wäre das also ziemlich genau ?

himitsu 13. Apr 2007 12:47

Re: Stunden/Minuten in Dezimalwerten
 
Wenn dir die Minutenauflösung reicht, dann geht es wohl kaum besser.

So hast du ja alles in Minuten und keine weiteren Rundungsfehler mehr ... wäre also gut so ^^

newuser01 13. Apr 2007 12:51

Re: Stunden/Minuten in Dezimalwerten
 
Ja Minuten reicht aus Sekunden brauch ich nicht ist ja nur zur Privaten Stundenabrechnung (Gesamtminuten werden dann addiert und in Stunden (Dezimalausgabe mit max 3 Kommazeichen) ausgegeben


DANKE FÜR DIE HILFE !!!


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:47 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