![]() |
Zeitsummen > 24h als string formatieren
Hallo,
ich wollte gerade ein paar Stundensummen zusammenrechnen lassen und habe festgestellt, daß TimeToStr alle ganzen Tage abschneidet und die Ausgabe nicht über 24:00 hinauskommt. Hat jemand eine Möglichkeit wie das geht? Grüße, Messie |
Re: Zeitsummen > 24h als string formatieren
Hallo Messie,
Delphi-Quellcode:
Grüße vom marabu
function DateTimeToStr2(dt: TDateTime; daySep: string): string;
begin Result := Format('%d%s%s', [Trunc(dt), daySep, TimeToStr(dt)]) end; |
Re: Zeitsummen > 24h als string formatieren
Ich meine er will eher, dass 1 Tag, 2 Stunden, 3 Minuten zu 26:03 wird, oder?
Delphi-Quellcode:
function DateTime2HoursAndMins (DT : TDateTime) : string ;
var h, n, s, ms : word ; begin decodetime (DT,h,n,s,ms) ; h := trunc (h + 24*trunc(DT)) ; Result := format ('%d.2',[h]) + ':' + format ('%d.2',[n]) ; end ; |
Re: Zeitsummen > 24h als string formatieren
Hi,
falls du eine Ausgabe mit Tagen möchtest, schau dir mal die Funktion DateTimeToStr oder FormatDateTime an. Wenn du nur Stunden (und Minuten) ausgeben möchtest wäre ein Integer (bzw. Double) imho besser geeignet. Sonst musst du TDateTime entsprechend selbst umwandeln. Das ganze könnte dann etwa so aussehen:
Delphi-Quellcode:
function DateTimeToHours(hours: TDateTime): String;
begin result := Format('%.2d:%.2d', [24 * Trunc(hours) + Trunc(24 * Frac(hours)), Round(Frac(24 * Frac(hours)) * 60)]); end; |
Re: Zeitsummen > 24h als string formatieren
Hallo,
ich habe Eure Vorschläge ausprobiert. Die Ergebnisse sind dann interessant, wenn bei der Summe der Stunden und Minuten genau 24:00 Stunden rauskommen. @jelly: Die trunc-Funktion macht den DateTime-Wert von 1 (24h 0 min) zu 0 :wiejetzt: Ich kann es nicht erklären, habe es aber in mehreren Varianten probiert. Deinen Quelltext habe ich leicht modifizieren müssen zu
Delphi-Quellcode:
weil sonst die Syntaxprüfung meckerte.
begin
decodetime (DT,h,n,s,ms) ; h := h + 24*trunc(DT); Result := format ('%.2d',[h]) + ':' + format ('%.2d',[n]) ; end; @marabu: Im Fall der Summe von 24:00 gibt Deine Routine 23:60 aus. Auch hier wird trunc(24h) zu 0, mit dem Rest wird weitergearbeitet. Das Ergebnis ist eigentlich logisch... Grüße, Messie |
Re: Zeitsummen > 24h als string formatieren
wenn du mit TDateTime arbeitest schau dir mal
DateUtils.pas an bzw. die dokumentation dazu an da gibts ne ganze reihe funktionen und proceduren, die interessant sein können. MfG tn249 |
Re: Zeitsummen > 24h als string formatieren
Hallo Messie,
Zitat:
Ich benutze gerne die Borland-Routinen, weil ich dadurch meine lines of code reduzieren kann. Wissen muss man dann allerdings, dass diese Routinen beim Arbeiten mit Zeitwerten unterhalb einer halben Millisekunde nicht mehr zuverlässig sind. Das bedeutet, dass man wegen Rundungsfehlerketten immer wieder zwischen diskreten Werten und TDateTime wechseln muss (Encode* und Decode*). Wenn du nicht weisst, wie du mit TDateTime umgehen musst, dann empfehle ich dir bei der Integer-Arithmetik zu bleiben. Allen Mitlesern kann ich versichern, dass die von mir angegebene Routine bei normalisierten Eingabewerten zuverlässig funktioniert. marabu Zum Spielen:
Delphi-Quellcode:
uses
DateUtils, SysUtils; var dt, dt1, dt2: TDateTime; begin dt1 := OneHour * 8; dt2 := OneHour * 16; dt := dt1 + dt2; WriteLn(DateTimeToStr2(dt + OneSecond / 2500, 'd ')); WriteLn(DateTimeToStr2(dt + OneSecond / 2000, 'd ')); WriteLn(DateTimeToStr2(dt, 'd ')); WriteLn(DateTimeToStr2(dt - OneSecond / 2000, 'd ')); WriteLn(DateTimeToStr2(dt - OneSecond / 2500, 'd ')); ReadLn; end; |
Re: Zeitsummen > 24h als string formatieren
Ich benutze eigentlich auch ausschließlich die Borland-Routinen, insofern wundert mich, daß es trotzdem nicht richtig geht. Was die Auflösung betrifft, habe ich etwa zwanzig Werte addiert, die nicht kleiner als eine Viertelstunde werden. Kann aber sein, daß Borland bei der Umwandlung aus dem String (ich lese die Werte aus einer nullterminierten Textdatei ein) die Ungenauigkeiten reinbringt.
Grüße, Messie |
Re: Zeitsummen > 24h als string formatieren
Hi,
natürlich kommen so Ungenauigkeiten rein. So geht es besser:
Delphi-Quellcode:
Freundliche Grüße vom marabu
function SumOfDateTime(dta: array of TDateTime): TDateTime;
var i: integer; mins: integer; isNegative: boolean; begin mins := 0; for i := Low(dta) to High(dta) do begin dt := dta[i]; isNegative := dt < 0; dt := Abs(dt); if isNegative then mins := mins - Trunc(dt) * MinsPerDay - MinuteOfTheDay(dt) else mins := mins + Trunc(dt) * MinsPerDay + MinuteOfTheDay(dt); end; isNegative := mins < 0; mins := Abs(mins); Result := mins div MinsPerDay; mins := mins mod MinsPerDay; Result := Result + EncodeTime(mins div 60, mins mod 60, 0, 0); if IsNegative then Result := -Result; end; PS: Jetzt teile ich die Minuten durch 60, damit die übliche Stundenzahl heraus kommt. Außerdem habe ich den Code angepasst, damit er nicht nur mit Bruchteilen eines Tages rechnet. Negative Werte werden jetzt auch verarbeitet. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:33 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