AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Zeitsummen > 24h als string formatieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zeitsummen > 24h als string formatieren

Ein Thema von messie · begonnen am 6. Jul 2005 · letzter Beitrag vom 7. Jul 2005
Antwort Antwort
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#1

Zeitsummen > 24h als string formatieren

  Alt 6. Jul 2005, 20:08
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Zeitsummen > 24h als string formatieren

  Alt 6. Jul 2005, 20:34
Hallo Messie,

Delphi-Quellcode:
function DateTimeToStr2(dt: TDateTime; daySep: string): string;
begin
  Result := Format('%d%s%s', [Trunc(dt), daySep, TimeToStr(dt)])
end;
Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Zeitsummen > 24h als string formatieren

  Alt 6. Jul 2005, 20:43
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 ;
  Mit Zitat antworten Zitat
Niko

Registriert seit: 23. Jun 2003
416 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Zeitsummen > 24h als string formatieren

  Alt 6. Jul 2005, 20:52
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;
"Electricity is actually made up of extremely tiny particles called electrons, that you cannot see with the naked eye unless you have been drinking." (Dave Barry)
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#5

Re: Zeitsummen > 24h als string formatieren

  Alt 6. Jul 2005, 22:20
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 Ich kann es nicht erklären, habe es aber in mehreren Varianten probiert. Deinen Quelltext habe ich leicht modifizieren müssen zu
Delphi-Quellcode:
  begin
    decodetime (DT,h,n,s,ms) ;
    h := h + 24*trunc(DT);
    Result := format ('%.2d',[h]) + ':' + format ('%.2d',[n]) ;
  end;
weil sonst die Syntaxprüfung meckerte.

@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
  Mit Zitat antworten Zitat
Benutzerbild von tn249
tn249

Registriert seit: 18. Jan 2004
Ort: München
164 Beiträge
 
Delphi 2005 Personal
 
#6

Re: Zeitsummen > 24h als string formatieren

  Alt 6. Jul 2005, 22:35
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
this post is printed on 100% recycled electrons
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: Zeitsummen > 24h als string formatieren

  Alt 7. Jul 2005, 07:17
Hallo Messie,

Zitat von messie:
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...
meine Routine ist schon in Ordnung, aber ich fürchte, dass du beim Umgang mit deinen Summanden im Hinblick auf die interne Darstellung von TDateTime unsauber arbeitest. Du musst für dich entscheiden, ob du mit Minuten als diskreten Zeiteinheiten arbeiten möchtest (Integer-Arithmetik) oder ob du die von Borland implementierte Logik rund um den Datentyp TDateTime nutzen möchtest.

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;
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#8

Re: Zeitsummen > 24h als string formatieren

  Alt 7. Jul 2005, 08:42
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#9

Re: Zeitsummen > 24h als string formatieren

  Alt 7. Jul 2005, 09:20
Hi,

natürlich kommen so Ungenauigkeiten rein. So geht es besser:

Delphi-Quellcode:
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;
Freundliche Grüße vom marabu


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.
  Mit Zitat antworten Zitat
Antwort Antwort


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:16 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