Laden...

Arbeitszeitberechnung: Wie Zeiten sinnvoll zerlegen und prüfen?

Erstellt von schnurzli vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.426 Views
S
schnurzli Themenstarter:in
34 Beiträge seit 2006
vor 5 Jahren
Arbeitszeitberechnung: Wie Zeiten sinnvoll zerlegen und prüfen?

Hallo allerseits,

ich habe eine eine grunsätzliche Frage zur Logik zum Thema DateTime und dem sinnvollen Abarbeiten von Berechnungen.

Ein Beispiel.
Ich habe eine von und eine bis Zeit. Diese kann sowohl am selben Tag als auch am darauffolgenden Tag sein.

Beispiel: Ich definiere zwei Zeiten für von und bis.


DateTime zeitvon = DateTime.Parse("22.01.2019 05:45");
DateTime zeitbis = DateTime.Parse("22.01.2019 10:00");

Nun würde ich gerne bestimmte Kriterien prüfen. Und da diese im 15 Minuten Takt sein kann, würde ich die Zeiten in 15 Minuten Bündel zerlegen.
In etwa so:


while (zeitvon <= zeitbis) {
      System.Console.WriteLine(zeitvon.ToShortTimeString());
      zeitvon = zeitvon.AddMinutes(15);
}

Danach habe ich Parameter in Form eines DateTime Feldes, die eine Grenze vorgeben.
Beispiel:


DateTime grenzebeginn= DateTime.Parse("01.01.1900 05:00");
DateTime grenzeende= DateTime.Parse("01.01.1900 06:00");

Und dann prüfe ich mit if einfach in while auf Erreichen der Grenze.

Ist das ein prkatikabler Weg, um ans Ziel zu kommen oder bin ich total auf dem Holzweg?
Fertige Klassen gibt es für so eine Logik nicht - ich habe zumindest keine gefunden.

LG Schnurzli

T
2.219 Beiträge seit 2008
vor 5 Jahren

Was willst du den erreichen?
Aktuell ist dies weder aus deinem Code noch deinem Text zu entnehmen.

Du kannst auch mit DateTime direkt rechnen, falls die an die Zeispanne zwischen einem Von/Bis Datum kommen willst.
Dann erhälst du dein TimeSpan Objekt, was dann die Zeitspanne zwischen deinem Von/Bis Datum enthält.

Aber ohne klaren Weg, was du damit erreichen willst, kann man dir nicht helfen.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

S
schnurzli Themenstarter:in
34 Beiträge seit 2006
vor 5 Jahren

Hi,

danke für deine rasche Rückmeldung. Ich möchte bestimmte Zeitgrenzen eingeben.
Ziel ist es, einen Tarifvertrag zu prüfen. Es geht um Arbeitszeit. Wenn man nun eine Arbeitszeit von - bis hat, möchte ich diese dann überprüfen.

Ich bin in meiem Beispiel nun schon ein wenig fortgeschrittener. Arbeitszeit ist wirklich etwas komplex Das lerne ich gerade 😃 Ich bin aber über jeden Ansatz und Optimierungsvorschlag erfreut 😃

Mein Ansatz: ich sammle in meiner Funktion sinnbildlich einmal alle meine Arbeitszeiten von einem Arbeitstag:

 DateTime[,] ZeitenMo = {
                {  DateTime.Parse("22.01.2019 05:45"), DateTime.Parse("22.01.2019 09:00") },
                {  DateTime.Parse("22.01.2019 09:30"), DateTime.Parse("22.01.2019 15:00") }
            };

Danach baue ich mir ein paar Funktionen für die einzelnen Prüfungen und versuche immer Summen zu bilden. Als erstes habe ich nun begonnen mir eine Funktion für die Gesamtsumme zu bauen. Die Funktion ist dann meine Ist-Summe. Nun prüfe ich, ob die Zeit einen bestimmten Wert des Tages überschreitet. Wenn das passiert, würde ich eine weitere Funktion erstellen, die diese Grenze prüft- Alle Zeiten darüber sind in meinem Beispiel dann Überstunden (Größer 8 Stunden) Da dies aber eigentlich im 15 Minuten Takt passieren kann (In meinem Beispiel ist dann ab 14:00 - 15:00 - also vier 15 Minuten Pakete schon als eine Überstunde zu markieren. Die 15 Minuten vor 6:00 würden dann in die Tarif Nacht fallen und würden auch zu einer Überstunde werden.

Es kommt dann noch eine Prüfung, ob die Stunde am Feiertag passiert oder am Sonntag... Aber im Wesentlichen immer dieselbe Logik in meinem Ansatz.

Und meine urspürngliche Frage war eben, ob dieser Ansatz sinnvoll für eine Prüfung ist oder ob es für eine Prüfung von Zeiten und der Grenzen eines Parameters eine bessere Lösung gibt.

LG Schnurzli

T
2.219 Beiträge seit 2008
vor 5 Jahren

Du kannst im DateTime mit TimeOfDay prüfen deine Zeiten vor oder nach einer bestimmten Tageszeit liegen.
Hier musst du dir ein TimeSpan als Vergleichsbjekt anlegen.
Hier helfen dir die From* Methoden von TimeSpan.
Um z.B. einen TimeSpan um 6 Uhr zu erhalten, brauchst du TimeSpan.FromHours(6).
Du kannst dann damit arbeiten.

Bsp:


DateTime zeitstempel = DateTime.Now;
TimeSpan sechsUhr = TimeSpan.FromHours(6);

if(zeitstempel.TimeOfDay > sechsUhr)
{
    Console.WriteLine("Es ist nach 6 Uhr");
}
else if(zeitstempel.TimeOfDay == sechsUhr)
{
    Console.WriteLine("Es ist exakt 6 Uhr");
}
else
{
    Console.WriteLine("Es ist vor 6 Uhr");
}

Links:
https://docs.microsoft.com/de-de/dotnet/api/system.datetime?view=netframework-4.7.2
https://docs.microsoft.com/de-de/dotnet/api/system.timespan?view=netframework-4.7.2

Dies dürfte dir bei der Umsetzung sehr helfen 😃

Nachtrag:
Du musst bei DateTime aber beachten, dass diese keine Feiertage kennt.
Diese müsstest du noch in deinem Projekt einpflegen als entsprechende Klasse.
Aber im großen und ganzen sollte es mit etwas Lernaufwand bei DateTime/TimeSpan keine zu große Sache sein.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

16.806 Beiträge seit 2008
vor 5 Jahren

Du kannst im DateTime mit TimeOfDay prüfen deine Zeiten vor oder nach

Dafür alleine braucht man prinzipiell kein TimeOfDay. Das geht auch mit der Hour-Property.
Der Vorteil ist eben, dass man bei TimeOfDay Tagesunabhängig kalkulieren kann - also ohne das Datum.

Das Problem von TimeOfDay ist jedoch - je nachdem was man damit machen will - wenn man Tagesübergreifend (zB Nachtschicht) Arbeitszeiten kalkulieren will.
Dann ist das Datum wichtig und TimeOfDay eher eine Behinderung.

S
schnurzli Themenstarter:in
34 Beiträge seit 2006
vor 5 Jahren

Guten Morgen,

danke für euren Input.

Ich baue meine Funktionen heute einmal zusammen und poste euch dann meinen Versuch.

@Abt: Ja es ist leider auch tagesübergreifend. Aber dafür nehmne ich nun das DateTimefeld komplett anstatt nur die Zeit zu berücksichtigen.

LG