AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TDateTime

Ein Thema von Brudertak · begonnen am 21. Jan 2006 · letzter Beitrag vom 2. Feb 2006
Antwort Antwort
Brudertak

Registriert seit: 21. Jan 2006
Ort: Chemnitz
2 Beiträge
 
#1

TDateTime

  Alt 21. Jan 2006, 23:52
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]
  Mit Zitat antworten Zitat
Hobby-Programmierer

Registriert seit: 19. Jan 2006
Ort: München
392 Beiträge
 
Delphi XE Starter
 
#2

Re: TDateTime

  Alt 22. Jan 2006, 08:34
Moin, Moin ...

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!

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 Gruss Mario

PS: Kleiner Tipp, Tagesgesamtabreitszeiten und Überstunden immer in Minuten umrechnen - erspart viel Ärger beim addieren Jahresarbeitszeiten und gesamtüberstunden
Mario
  Mit Zitat antworten Zitat
Benutzerbild von ibp
ibp

Registriert seit: 31. Mär 2004
Ort: Frankfurt am Main
1.511 Beiträge
 
Delphi 7 Architect
 
#3

Re: TDateTime

  Alt 22. Jan 2006, 09:49
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;
  Mit Zitat antworten Zitat
Hobby-Programmierer

Registriert seit: 19. Jan 2006
Ort: München
392 Beiträge
 
Delphi XE Starter
 
#4

Re: TDateTime

  Alt 23. Jan 2006, 06:21
Moin, Moin
@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
Mario
  Mit Zitat antworten Zitat
marabu

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

Re: TDateTime

  Alt 23. Jan 2006, 08:28
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
  Mit Zitat antworten Zitat
Brudertak

Registriert seit: 21. Jan 2006
Ort: Chemnitz
2 Beiträge
 
#6

Re: TDateTime

  Alt 2. Feb 2006, 11:38
Danke erst mal für die ganzen Antworten, und ich habe eure tips beherzigt und jetzt funktionierte es auch. Danke noch mal...
  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 11:28 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