Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   TDateTime (https://www.delphipraxis.net/61482-tdatetime.html)

Brudertak 21. Jan 2006 23:52


TDateTime
 
Hallo,
Ich habe ein Problem.
Ich will ein Progamm schreiben wo man die Überstunden ausrechnen kann, soweit noch kein Problem.
Aber wenn jetzt einer z.B. eine Nachtschicht hätte werden mir bis zum regulären Arbeitszeit ende die fehlenden Stunden ausgegeben. Aber wenn ich über diese Stunden drüber bin fängt er auf einmal an von 24 Uhr Rückwärts ab zu ziehen. Es zeigt mir dann also nicht die richtigen Überstd. an. Kann das irgendwie sein das Delphi die Zeiten nicht so rechnet wie man es sonst machen würde?

Bsp.: von 22:00:00 bis 06:00:00 bei 08:00:00 Std. Arbeitszeit.
solange es 06:00:00 ist zeigt er 00:00:00 Überstd. an bei 06:01:00
zeigt er dann 23:59:00 überstd. an. ???

Quellcode:

Delphi-Quellcode:
procedure TForm1.BitBtn2Click(Sender: TObject);
var anft,endt,uebert,uebert1,a:TDateTime;
var h,m,s,ms:Word;
var b:string;
var z:integer;
begin
anft:=StrToTime(medt_anft.Text);
endt:=StrToTime(medt_endt.text);
a:=EncodeTime(08,0,0,0);

uebert:=endt-anft;
uebert:=uebert-a;

if uebert1 < 0 then label3.Caption:= 'noch zu Arbeiten';
if uebert1 > 0 then label3.Caption:= 'Überstunden';

medt_uebert.text:=TimeToStr(uebert1) ;

end;
Danke.

[edit=Christian Seehase]Delphi-Tags gesetzt. Bitte künftig selber machen. Danke. Mfg, Christian Seehase[/edit]

Hobby-Programmierer 22. Jan 2006 08:34

Re: TDateTime
 
Moin, Moin ... :lol:

Du hast ein Problem in dem du nur mit Uhrzeiten rechnest. Gerade bei Uhrzeiten mit Datumssprung musst du aber genau diese 24h wieder abziehen !!
Sprich: 20:00 Uhr - 06:00 Uhr würden 14 Stunden ergeben! :oops:

Alternative: Wenn möglich solltest Du Datum und Uhrzeit bei der Berechnung mit einbeziehen, dann hast Du o.g. Probleme nicht. Hast Du das Datum nicht zur Verfügung kannst Du aber auch wenn ein Datumssprung vorliegt, einfach rechnen 24 Stunden - 14 Stunden = 10 Stunden

Delphi-Quellcode:
procedure TForm1.BerechneClick(Sender: TObject);
var Start, Ende, Gesamt: TDateTime;
begin
  Start:= StrToTime('20:00'); // gleiches Datum
  Ende:= StrToTime('6:00');  // gleiches Datum
  if Ende < Start then // Datumssprung
    Ende:= Ende +1; // also EndDatum um einen Tag verschieben
  Gesamt:= (start - ende); // jetzt können wir rechnen :o)
  Label1.Caption:= TimeToStr(Gesamt);
end;
Da ich selber schon eine Dienstplanverwaltung programmiert habe weiss ich was Du noch an Arbeit vor dir hast :roll: Gruss Mario

PS: Kleiner Tipp, Tagesgesamtabreitszeiten und Überstunden immer in Minuten umrechnen - erspart viel Ärger beim addieren Jahresarbeitszeiten und gesamtüberstunden :wiejetzt:

ibp 22. Jan 2006 09:49

Re: TDateTime
 
es geht auch einfacher ist nur ein beispiel was man anpassen kann....

Delphi-Quellcode:
function timebetween(anow,athen:tdatetime):string;
var
  h,m,s:integer;
begin
  s:=SecondsBetween(dtp2.DateTime,dtp1.DateTime);
  m:=s div 60;
  s:=s-(m*60);
  h:=m div 60;
  m:=m-(h*60);
  result:=inttostr(h)+':'+inttostr(m)+':'+inttostr(s);
end;

Hobby-Programmierer 23. Jan 2006 06:21

Re: TDateTime
 
Moin, Moin :stupid:
@ibp ... Nicht ganz richtig !
Wenn ich das Datum zur Verfügung habe geht das natürlich so in Ordnung und sogar noch einfacher, aber darüber stand nichts in der Frage. O.g. Beispiel sollte nur den 'Weg' aufzeigen. Der OP wollte lediglich Aufklärung wie er die Differenz von 2 Uhrzeiten richtig ermitteln kann. Ermitteln deswegen, weil errechnen durch einfache Subtraktion scheidet ja wohl aus !!
Beim rechnen mit Uhrzeiten ohne Datum muss man einfach dem Datumssprung Rechnung tragen !!
Selbst wenn ich zur Uhrzeit das Datum seperat mit einfüge, muss ich trotzdem - ob es Dir passt oder nicht - dafür Sorge tragen das das Ende.Datum um einen Tag höher liegt als das Start.Datum.
Sprich: Ende.Zeit < Start.Zeit = (Ergebnis.Zeit + 24 Stunden) ...

bei folgender Function gehts mit oder ohne Datum:
Delphi-Quellcode:
Function TimeDif(Start, Ende: TDateTime): TTime;
var H, M: Integer;
    R: Real;
begin
  if Start > Ende then
    Ende:= IncDay(Ende);
  R:= HourSpan(Start,Ende);
  H:= Round(Int(R));       // Stunden
  M:= Round(Frac(R)* 60);  // Minuten
  if M = 60 then begin     // aus 60 Min wird 1 volle Stunde
    M:= 0;
    Inc(H);
  end;
  Result:= StrToTime(Format('%d:%.2d',[H, M]));
end;
... und der Aufruf wie folgt:
Delphi-Quellcode:
var ABeg, AEnd: TTime;
    Saz: TTime;
    Iaz: TTime;
    S: String;
begin
  ABeg:= StrToTime('8:00'); // ArbeitsBeginn
  AEnd:= StrToTime('16:00'); // ArbeitsEnde
  Saz:= StrToTime('8:30');  // Soll-Arbeitszeit
  Iaz:= TimeDif(ABeg, AEnd); // Ist-Arbeitszeit
  if Iaz > Saz then         // Soll erfüllt ? = Überzeit
    S:= 'Überzeit  ' + FormatDateTime('t', TimeDif(Saz, Iaz))
   else                     // sonst RestArbeitszeit
    S:= 'Rest        '+ FormatDateTime('t', TimeDif(Iaz, Saz));

  ShowMessage('ArbZeit   '+ FormatDateTime('t', ABeg)+ ' - '+
                            FormatDateTime('t', AEnd)+ #10#13#13+
              'Az (Soll)  '+ FormatDateTime('t', Saz)+ #10#13+
              'Az (Ist)   '+ FormatDateTime('t', Iaz)+ #10#13+
              S);
end;
Gruss Mario :dancer:

marabu 23. Jan 2006 08:28

Re: TDateTime
 
Herzlich Willkommen in der Delphi-PRAXiS, BruderTak und Hobby-Programmierer Mario.

Zeitabrechnung ist ein komplexes Thema. Starre Arbeitszeiten sind da noch recht einfach umzusetzen, aber sobald mehrere Arbeitszeitmodelle möglich sind, wird es schnell haarig. Auf jeden Fall darf man nie vergessen, dass der Datentyp TDateTime in Delphi eine Zeitdauer speichert - und keinen Zeitpunkt. Die Frage, ob ein Tag hinzugerechnet werden muss oder nicht, stellt sich bei korrekter Umsetzung des Problems eigentlich nicht, da Start- und Ende-Zeiten Zeitpunkte repräsentieren und deshalb grundsätzlich mit ihrem Datumsanteil gespeichert werden müssen, damit sie einen gemeinsamen Bezugspunkt haben. Welche String-Repräsentation für einen Zeitpunkt oder eine Zeitdauer zur Interaktion mit einem Benutzer gewählt wird, steht auf einem ganz anderen Blatt. Deshalb ist eine Zeitdifferenz stets (dtEnde - dtStart).

Werden Zeitaggregate (Monats-Ist) gebildet, dann werden alle konstituierenden Angaben (Tages-Ist) zweckmäßigerweise als Sekundenbetrag geführt, um hässliche Abbildungsfehler vom und zum internen Datentyp (Float) zu vermeiden.

Freundliche Grüße vom marabu

Brudertak 2. Feb 2006 11:38

Re: TDateTime
 
Danke erst mal für die ganzen Antworten, und ich habe eure tips beherzigt und jetzt funktionierte es auch. Danke noch mal... :-D


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