![]() |
mit Zeiten Rechnen
Hallo ich möchte mit Zeiten rechnen und bräuchte bisl Hilfe,
Ich habe eine Zahl (Minutenanzahl), die in eine Zeitangabe umgerechnet werden soll bsp. 135,5 min = 2:15:30 (2h15min30s) diese Minutenanzahl wird durch 2 Editfelder berechnet. (Time2) Nach dieser Berechnung wird in ein drittes Editfeld eine weitere Zeitangabe (Format hh:mm:ss) eingegeben. (Time1) Von dieser Zeitangabe sollen die vorherigen Minuten abgezogen werden (Time3 = Time1-Time2) Kann mir da irgendjemand weiterhelfen? Irgendwie krieg ich das mit den Encode/DecodeTime-Funktionen nich ganz hin. Folgenden Code habe ich bisher
Delphi-Quellcode:
(bitte keine professionellen Code-Vorschläge, sondern einfachen simplen Code, damit ich es auch selber verstehe *gg*)
a := StrToInt64(Edit1.Text); //a = Ressis vorhanden
b := StrToInt64(Edit2.Text); //b = Ressiproduktion pro h h := Trunc(a/b); //h = Stundenanzahl seit Verlassen der Flotte m := Round(h/60); //m = Minutenanzahl seit Verlassen der Flotte s := Round(m/60); ss:= Round(S/100); TimeSeparator := ':'; ShortTimeFormat := 'hh:mm:ss'; Time1 := StrToTime(Edit3.Text); //Time1 = Spionagezeitpunkt TryEncodeTime(h,m,s,ss,Time2); //Time2 = berechnete Flugzeit aus Ressiproduktion Time3 := Time1-Time2; DecodeTime(Time3,h3,m3,s3,ss3); Label1.Caption := IntToStr(h3) + ':' + IntToStr(m3) + ':' + IntToStr(s3); |
Re: mit Zeiten Rechnen
Erstmal ist die Anzahl der Minuten nicht die Anzahl der Stunden durch 60 sondern die Anzahl der Stunden mal 60 ;) (genauso bei sekunden etc.)
Dann sieht es bei dir so aus dass du sagst: 2 Stunden, 120 Minuten und 7200 Sekunden, wobei du ja eher meinst: 2 Stunden, 0 Minuten und 0 Sekunden ;) Also berechne erstmal die Anzahl der hundertstel Sekunden aus der Stundenzahl:
Delphi-Quellcode:
var
ss,s,m,h,rest:integer; begin rest:=round(ZEITWERT IN STUNDEN * 360000); //den zeitwert in Stunden solltest du mit strtofloat bestimmen (Kommazahlen möglich) ss:=rest mod 100 //Die Anzahl der Hundertstelsekunden entspricht dem Teilungsrest des Zeitwerts (rest) durch hundert. rest:=rest div 100 //Jetzt durch hundert teilen, da die Hundertstelsekunden erledigt sind. //das selbe mit sec/min/h machen: s:=rest mod 60; rest:=rest div 60; min:=rest mod 60; rest:=rest div 60; h:=rest; //der übrige Wert in REST ist die Stundenanzahl end; |
Re: mit Zeiten Rechnen
Hallo,
Du kannst die Sache noch weiter vereinfachen, wenn Du die Routine IncMilliSecond aus der Unit DateUtils verwendest. Damit kann man eine Anzahl Millisekunden zu einem TDateTime-Wert addieren:
Delphi-Quellcode:
Zur Ausgabe des Ergebnisses könntest Du die Funktion FormatDateTime aus der Unit SysUtils verwenden:
a := StrToInt64(Edit1.Text); // a = Ressis vorhanden
b := StrToInt64(Edit2.Text); // b = Ressiproduktion pro h Time1 := StrToTime(Edit3.Text); // Time1 = Spionagezeitpunkt // Stundenanzahl seit Verlassen der Flotte berechnen h := Trunc(a / b); // Flugzeit vom Spionagezeitpunkt subtrahieren Zeit := IncMilliSecond(Time1, -h * 360000);
Delphi-Quellcode:
Gruß Hawkeye
Label1.Caption := FormatDateTime('hh:nn:ss', Zeit);
|
Re: mit Zeiten Rechnen
Und noch einfacher
Delphi-Quellcode:
Denn 135.5 Minuten / 60 Minuten / 24 Stunden sind die Bruchteile eines Tages, und ein TDateTime ist nichts anderes als
Label1.Caption := FormatDateTime('hh:nn:ss', 135.5 / 60 / 24);
TDateTime = Anzahl Tage komma Bruchteile eines Tages Ein Wert von 0.5 in einem TDateTime ist also exakt 12 Uhr, 0.75 = 3/4tel eines Tages also 18 Uhr. Du musst also keinerlei Umwege über Stringformatierungen, Datum/Zeit-de-/enkodierungen gehen. Du kannst also ganz einfach mit Zeiten rechnen: 12 Uhr + 15 Minuten ist TDateTime( (12 / 24) + (15 / 60 / 24) ) Gruß Hagen |
Re: mit Zeiten Rechnen
@Hagen: Alles lesen :wink:
Er möchte keinen konstanten Wert darstellen, sondern einen berechneten... Gruß Hawkeye |
Re: mit Zeiten Rechnen
Außerdem, müsste es nicht heißen: 'hh:mm:ss'?
|
Re: mit Zeiten Rechnen
Zitat:
Diese Frage taucht alle par Tage in der DP auf und immer wieder sehe ich Vorschlage die viel zu kompliziert darauf antworten. Aber am schlimmsten empfinde ich eben den Punkt das die vielen Antworten deutlich zeigen das man nicht verstanden hat was ein TDateTime ist, wie darin das Datum/Uhrzeit oder eben einfach Zeiten kodiert sind und wie man damit rechnet. Die viele Datum/Zeit Funktion in der RTL sind ja schön und gut aber fast 90% dieser Funktionen sind überflüssig und verkomplizieren das Verständnis. Worauf ich also mit obigen Posting hinaus wollte ist nicht die fertige Lösung sondern das Verständnis zur fertigen Lösung.
Delphi-Quellcode:
So besser !? oder so ?
Label1.Caption := FormatDateTime('hh:nn:ss', StrToFloat(Edit1.Text) / 60 / 24);
Delphi-Quellcode:
Label1.Caption := FormatDateTime('hh:nn:ss', MinutenWert / 60 / 24);
Zitat:
Und nur kurz was man in Delphi 6 unit Dateutils.pas findet:
Delphi-Quellcode:
Viele schöne Datum/Zeit Funktionen, viel zu viele und dann noch offensichtlich falsch.
function MilliSecondOfTheYear(const AValue: TDateTime): Int64;
begin Result := MilliSecondOf(AValue) + SecondOfTheYear(AValue) + 1000; end; function MilliSecondOfTheMonth(const AValue: TDateTime): LongWord; begin Result := MilliSecondOf(AValue) + SecondOfTheMonth(AValue) + 1000; end; function MilliSecondOfTheWeek(const AValue: TDateTime): LongWord; begin Result := MilliSecondOf(AValue) + SecondOfTheWeek(AValue) + 1000; end; Funktionen wie Estern() fehlen aber. Gruß Hagen |
Re: mit Zeiten Rechnen
Zitat:
|
Re: mit Zeiten Rechnen
Stimmt ;)
Gruß Hagen |
Re: mit Zeiten Rechnen
Guten Morgen.
Um beim Rechnen mit Zeitwerten nicht unnötig durch die zwangsläufigen Rundungsfehler der Fließkommaarithmetik überrascht zu werden, rechne ich stets mit Ganzzahlwerten (Sekunden), konvertiere diese aber für die Anzeige und die Benutzereingabe von und zu TDateTime (Fließkommawert) und schließlich String, wobei die von Hagen erwähnte Unit DateUtils gute Dienste leistet. Zum Thema Rundungsfehler beim Rechnen mit Zeiten ist vielleicht auch das Lesen in diesem thread interessant: ![]() Freundliche Grüße vom marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:52 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 by Thomas Breitkreuz