C# Saldoberechnung;Problem: Rechnen mit Minus Zeiten

Fasko

Lt. Junior Grade
Registriert
Jan. 2011
Beiträge
481
Hallo,

zuerst die Situation:
zurzeit versuche ich ein Programm zu entwickeln, dass mir auf der Arbeit anzeigt, wie viele Überstunden (oder auch nicht) ich am jeweiligen Tag gemacht habe.
Dazu gebe ich morgens den Starttermin an, wann ich angefangen habe. Die Sollzeit und Pause sind im Programm automatisch festgelegt, können aber vom Benutzer bzw. von mir während das Programm läuft geändert werden.
Die Oberfläche wird automatisch aktualisiert.

Das Problem:
Soweit funktioniert alles technisch... nur bei der Saldorechnung selber habe ich ein Problem:
Mir wird immer eine Fehlermeldung ausgegeben, wenn die Saldozeit nicht im positiven Bereich ist.

Code:
public void berechneVergangeneZeit(int stunden, int minuten)
        {
            // Vom User angegebene Zeit umsetzen für die weitere Verwendung
            DateTime zeit = DateTime.Today;
            zeit = zeit.AddHours(stunden);
            zeit = zeit.AddMinutes(minuten);

            // Zeitspanne berechnen
            TimeSpan zeitspanne = new TimeSpan (DateTime.Now.Ticks - zeit.Ticks);
            zeit = new DateTime(zeitspanne.Ticks);
            lbn_Zeit.Text = String.Format("Du bist {0} hier!", zeit.ToString("t"));
            //lbn_Zeit.Text=zeit.ToString("t");
            lbn_aktUhrzeit.Text = String.Format("Aktuelle Uhrzeit: {0}",DateTime.Now.ToString("t"));

            berechneSaldo(zeit);
           
        }

        public void berechneSaldo(DateTime aufArbeit)
        {
            int pause = int.Parse(tbx_pauseMinuten.Text)*-1;
            lbn_stundenSaldo.Text = pause.ToString();

            // Pause subtrahieren + Sollzeit subtrahieren
            aufArbeit = aufArbeit.AddMinutes(pause-int.Parse(tbx_sollzeit_mm.Text));
            aufArbeit = aufArbeit.AddHours(-int.Parse(tbx_sollzeit_hh.Text));
            
            lbn_stundenSaldo.Text = String.Format("Saldo: {0}",aufArbeit.ToString("t")); 

        }

Kann mir jemand helfen dieses Logikproblem zu beseitigen. Ich versuche zurzeit C# zu lernen, darum bitte ich um Entschuldigung, wenn ich vielleicht etwas offensichtliches übersehen haben sollte. :rolleyes:

Gruß

Fasko
 

Anhänge

  • Ausgabe-Optimalfall.JPG
    Ausgabe-Optimalfall.JPG
    30,3 KB · Aufrufe: 348
  • Ausgabe-Problemfall.JPG
    Ausgabe-Problemfall.JPG
    57 KB · Aufrufe: 318
Mach doch intern eine dezimale Berechnung. Also statt 2:30h -> 2.5. Dann wirste auch mit negativen Zeiten zurecht kommen. Stichwort: Industrieminute

Die Ein- und Ausgaben entsprechend parsen / zurückkonvertieren
 
Zuletzt bearbeitet:
oder du überprüfst vorher ob eine negative uhrzeit rauskommt... und setzt das minus von "hand"
 
bin nun kein cä experte, aber da steht doch das dass problem an der von dir verwendeten klasse liegt, diese kann anscheinend nichts mit negativen zahlen anfangen.
Also entweder die klasse entsprechend erweitern, oder andere berechnung heranziehen.

ich würde dir auch raten statt 2:30 lieber 2,5 zu nehmen.

oder aber einfach einen urhzeit string nehmen wie 2:30, zerlegen in 2 und 30 und dann kannst stunden-stunden und minuten - minuten machen, sonderfall wenn die endzeit kleiner als startzeit ist, dann bissl anders.
 
sparvar schrieb:
oder du überprüfst vorher ob eine negative uhrzeit rauskommt... und setzt das minus von "hand"

In die Richtungen gingen bis gerade auch meine Überlegungen. Ich habe das nun auch versucht, bzw. vorher getestet ob das möglich ist.
Leider bricht der schon bei der Rechnung ab. Ich habe das herausgefunden indem ich gesagt habe, er soll direkt nach der Rechnung den Text eines Buttons ändern. Was er schon nicht mehr macht.
Code:
        public void berechneSaldo(DateTime aufArbeit)
        {
            int pause = int.Parse(tbx_pauseMinuten.Text) * -1;
            lbn_stundenSaldo.Text = pause.ToString();

            // Pause subtrahieren + Sollzeit subtrahieren
            aufArbeit = aufArbeit.AddMinutes(pause - int.Parse(tbx_sollzeit_mm.Text));
            aufArbeit = aufArbeit.AddHours(-int.Parse(tbx_sollzeit_hh.Text));

            btn_aktZeit.Text = "Ahh";
            lbn_stundenSaldo.Text = String.Format("Saldo: {0}", aufArbeit.ToString("t"));

        }
 
dann nutz mal den Debugger. Der ist für sowas nützlich
 
Mercsen schrieb:
bin nun kein cä experte, aber da steht doch das dass problem an der von dir verwendeten klasse liegt, diese kann anscheinend nichts mit negativen zahlen anfangen.
Also entweder die klasse entsprechend erweitern, oder andere berechnung heranziehen.

ich würde dir auch raten statt 2:30 lieber 2,5 zu nehmen.

oder aber einfach einen urhzeit string nehmen wie 2:30, zerlegen in 2 und 30 und dann kannst stunden-stunden und minuten - minuten machen, sonderfall wenn die endzeit kleiner als startzeit ist, dann bissl anders.

Ich habe keine genaue Vorstellung davon, wie ich das mit dem double-parsen mache...
Könnte man das nicht auch "irgendwie" mit TimeSpan lösen?
 
Du solltest das definitiv mit TimeSpan lösen, da du ja ein Zeitintervall haben willst. Immer darauf achten, womit gerechnet wird.
 
WingX schrieb:
Du solltest das definitiv mit TimeSpan lösen, da du ja ein Zeitintervall haben willst. Immer darauf achten, womit gerechnet wird.

Nur wie rechne ich mit TimeSpan. Wie ich die Spanne zwischen zwei Zeiten rausfinde weiß ich ja...
 
Fasko schrieb:
Hallo,

Code:
        public void berechneSaldo(DateTime aufArbeit)
        {
            ....
            lbn_stundenSaldo.Text = pause.ToString();
            ......
            lbn_stundenSaldo.Text = String.Format("Saldo: {0}",aufArbeit.ToString("t")); 

        }

das erste kannste dir auch sparen.

Ach ja, hier noch eine kleien Lösung - such dir das raus was du brauchst :) (nur ne kurze konsolenanwendung)


Code:
 DateTime anfangszeit = DateTime.Today;

            anfangszeit = anfangszeit.AddHours(8);
            anfangszeit = anfangszeit.AddMinutes(10);

            DateTime endzeit = DateTime.Today;

            endzeit = endzeit.AddHours(17);
            endzeit = endzeit.AddMinutes(40);

            TimeSpan sollArbeitszeit = new TimeSpan(8, 0, 0);
            TimeSpan pause = new TimeSpan(0, 30, 0);

            TimeSpan istArbeitszeit = new TimeSpan();
            istArbeitszeit = endzeit.Subtract(anfangszeit);


            TimeSpan Saldo =  new TimeSpan();
            Saldo = istArbeitszeit - sollArbeitszeit - pause;

Damit kannste dir alles ausgeben was du willst.
 
sparvar schrieb:
das erste kannste dir auch sparen.

Ach ja, hier noch eine kleien Lösung - such dir das raus was du brauchst :) (nur ne kurze konsolenanwendung)


Code:
 DateTime anfangszeit = DateTime.Today;

            anfangszeit = anfangszeit.AddHours(8);
            anfangszeit = anfangszeit.AddMinutes(10);

            DateTime endzeit = DateTime.Today;

            endzeit = endzeit.AddHours(17);
            endzeit = endzeit.AddMinutes(40);

            TimeSpan sollArbeitszeit = new TimeSpan(8, 0, 0);
            TimeSpan pause = new TimeSpan(0, 30, 0);

            TimeSpan istArbeitszeit = new TimeSpan();
            istArbeitszeit = endzeit.Subtract(anfangszeit);


            TimeSpan Saldo =  new TimeSpan();
            Saldo = istArbeitszeit - sollArbeitszeit - pause;

Damit kannste dir alles ausgeben was du willst.

Daaaaanke! :)

Gruß
Fasko
 
Zurück
Oben