Feedback

C# - Zeitdifferenz berechnen

Veröffentlicht von am 13.11.2010
(5 Bewertungen)
Mit diesem Snippet kann die Zeit zwischen zwei Uhrzeiten ausgerechnet werden.

Optional können pauseminuten übergeben werden.

Aufrufbeispiel:

label1.Text = zeitdifferenz(textboxstart.text, textboxende.text, "");
public string zeitdifferenz(string startzeit, string endezeit, string pause) //String pause in minuten!

        { 
            // Format HH:MM z.B. 07:00. Wenn keine pause eingerechnet werden soll -> string pause = ""

            DateTime start;
            DateTime end;

            if (pause == "") 
            {
                pause = "0";
            }

            string datum = Convert.ToString(DateTime.Now);
            datum = datum.Remove(10, 9);

            string gesamtanfang = datum + " " + startzeit + ":00";
            string gesamtende = datum + " " + endezeit + ":00";

            start = Convert.ToDateTime(gesamtanfang);
            end = Convert.ToDateTime(gesamtende);

            int minuten = Convert.ToInt32(end.Subtract(start).TotalMinutes);
            //int minuten = Zeitdifferenz in Minuten | statt .TotalMinutes können natürlich auch z.B. Sekunden berechnet werden!

            int pauseminuten = Convert.ToInt32(pause);
            minuten = minuten - pauseminuten;

            int stunden;
            int rest;

            stunden = minuten / 60;
            rest = minuten % 60;

            string ausgabe = "Die Zeitspanne beträgt: " + Convert.ToString(stunden) + " Stunden und " + Convert.ToString(rest) + " Minuten";

            return ausgabe; 

        }
Abgelegt unter Zeitdifferenz, zeit, stunden, minuten, sekunden.

6 Kommentare zum Snippet

spezi schrieb am 13.11.2010:
zu umständlich. Sowas wie
ausgabe = end.Subtract(start).Subtract(pause).ToShortTimeString();
...hätte es auch getan
Dominic schrieb am 15.11.2010:
Ja, das verkürzt einiges. Danke für den Tipp!
Boas Enkler schrieb am 22.11.2010:
im Sinne des Soc Sollten die Differenz Berechnung und die Stringformatierung auf eigene Methoden aufgegliedert werdem, so ist der code 1. kaum testbar und 2. kaum wiederverwendbar.

Curry schrieb am 25.11.2010:
Sry, aber das Snippet ist eines der schlechtesten Codes, die ich je zu Gesicht bekommen habe.

- Wieso string-Parameter und keine DateTime? -> fehleranfällig z.B. bei falscher Eingabe
- Für was um Himmelswillen eine Pause?
- in der DateTime-Klasse gibt es doch eh schon alles. Für was das Rad neu erfinden? :S

Jeder war mal blutiger Anfänger, aber dann stellt man doch nicht so einen Code ins Internet :(
DotNetMastermind schrieb am 29.11.2010:
@curry
Ich denke, dass als Parameter der string-Datentyp gewählt wurde, damit eine Übergabe der TextBox-Einträge ohne Konvertierung möglich ist.

@Dominic
Dennoch ist dieses Snippet sehr umständlich geschrieben und kann auf nur einige wenige Zeilen gekürzt werden :

private string zeitdifferenz(string startzeit, string endezeit, string pause)
{
int Hours = DateTime.Parse( endezeit ).Hour - DateTime.Parse( startzeit ).Hour;
int Minutes = DateTime.Parse( endezeit ).Minute - DateTime.Parse( startzeit ).Minute;
int Pause;

Int32.TryParse( pause, out Pause );
int OverallMinutes = (Hours * 60 + Minutes) - Pause;

return "Die Zeitspanne beträgt: " + (OverallMinutes / 60).ToString() + " Stunden und " + (OverallMinutes % 60).ToString() + " Minuten";
}
Curry schrieb am 30.11.2010:
Ja, das habe ich natürlich gesehen. Aber das ist trotzdem nicht recht sinnig. (Wiederverwendbarkeit! -> Universeller denken und nicht nur an den Datenzufluss durch die TextBox denken)

Sinnvoller wäre es, die gegebenen String mithilfe von DateTime.TryParse zu überprüfen und dann als DateTime-Objekte zu übergeben. Oder am einfachsten wäre es natürlich, DateTimePicker zu verwenden...
 

Logge dich ein, um hier zu kommentieren!