Mit Timespan arbeiten, für Zeiterfassung

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von TiTo.

    Mit Timespan arbeiten, für Zeiterfassung

    Hallo Community,

    ich arbeite grade an einem Zeiterfassungssystem.
    Ich habe aber grade Probleme mit Timespan, und zwar wenn er die Stunden addieren soll, dann macht er das im 24h Rythmus...

    Kann mir evtl. jemand helfen?

    VB.NET-Quellcode

    1. Dim GesamtA As TimeSpan
    2. Dim GesamtS As TimeSpan
    3. If SQLreader2(7).ToString = "" Then 'Leeren Timespan generieren
    4. GesamtS = GesamtS.Add(New TimeSpan(0, 0, 0, 0, 0))
    5. ElseIf SQLreader2(8).ToString = "ÜB" Then 'Überstunden abziehen
    6. GesamtA = TimeSpan.Parse(SQLreader2(7).ToString)
    7. GesamtS = GesamtS.Subtract(GesamtA)
    8. Else 'Normal Addieren
    9. GesamtA = TimeSpan.Parse(SQLreader2(7).ToString)
    10. GesamtS = GesamtS.Add(GesamtA)
    11. End If

    TiTo schrieb:

    Kann mir evtl. jemand helfen?
    Falls Du Deinen Thread versehentlich geschlossen haben solltest - erstell einen Post und er ist wieder offen.
    Ich denke mal, Du denkst in falschen Kategorien.
    DateTime ist ein Punkt (Termin) auf dem Zeitstrahl.
    TimeSpan ist eine Dauer, die Differenz 2er DateTime-Werte.
    Die Summe 2er DateTime-Werte ist nicht definiert:
    Was sollte 3.7.2013 14:20 PLUS 3.7.2013 17:30:30 sein :?:
    Zur Zeiterfassung musst Du den gegenwärtigen TimeStamp abfragen und kannst da natürlich 2 Stunden dazuzählen:

    VB.NET-Quellcode

    1. Dim dt = DateTime.Now
    2. dim dt2 = dt.AddHours(2)
    So.
    Und jetzt überlegst Du Dir erst mal, was genau Du erfassen und berechnen willst. :D
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich danke euch vielmals, aber das Problem lag darin, dass ich es falsch formatiert ausgegeben habe.

    So hatte ich das:

    VB.NET-Quellcode

    1. txt = String.Format("{0:00}:{1:00}:{2:00}", GesamtS.Hours, GesamtS.Minutes, GesamtS.Seconds)


    Und so muss es sein:

    VB.NET-Quellcode

    1. txt = String.Format("{0:00}:{1:00}:{2:00}", GesamtS.TotalHours, GesamtS.Minutes, GesamtS.Seconds)



    Ich habe aber grade nur das Problem, dass der Erste Wert falsch zusammen gerechnet wird. Und zwar addiert er einfach so eine Stunde dazu.



    Der erste Eintrag, schaut mal auf Arbeitszeit und Arbeitszeit Gesamt...

    TiTo schrieb:

    Und zwar addiert er einfach so eine Stunde dazu.
    Welcher Eintrag, wo drauf?
    Kannst Du etwas mehr Einzelheiten guggen lassen?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Es tut mir Leid, aber das ganze war ein Rundungfehler, den ich erst im nachhinein entdeckt habe.

    Ich musste die TotalHours, mit Math.Floor erst richtig runden...

    VB.NET-Quellcode

    1. Dim txt = String.Format("{0:00}:{1:00}:{2:00}", Math.Floor(GesamtS.TotalHours), GesamtS.Minutes, GesamtS.Seconds)


    Und zwar so, muss man das ganze runden, damit ist korrekt zusammen gezählt wird.

    TiTo schrieb:

    damit ist korrekt zusammen gezählt wird.
    Kannst Du mal schreiben, was wie zusammengezählt wird?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    VB.NET-Quellcode

    1. Dim Arbeitszeit As String = SQLreader2(7).ToString
    2. Dim GesamtA As TimeSpan
    3. Dim GesamtS As TimeSpan
    4. If SQLreader2(8).ToString = "ÜB" Then 'Überstunden abziehen
    5. GesamtA = TimeSpan.Parse(Arbeitszeit)
    6. GesamtS = GesamtS.Subtract(GesamtA)
    7. Arbeitszeit = "-" + Arbeitszeit
    8. Else 'Hier die Arbeitszeiten zusammen zählen
    9. GesamtA = TimeSpan.Parse(Arbeitszeit)
    10. GesamtS = GesamtS.Add(GesamtA)
    11. End If
    12. Dim txt = String.Format("{0:00}:{1:00}:{2:00}", Math.Floor(GesamtS.TotalHours), GesamtS.Minutes, GesamtS.Seconds)


    Wenn etwas nicht klar ist, dann kann ich gerne erklären wie was abläuft.