C# odejmowanie godzin - wyliczanie nadgodzin

0

Witam

Mam w bazie zapisany jako string czas przepracowany danego dnia w postaci gg:mm.
Chciałbym bym od tego odjąć 8 godzin czyli 08:00 i wyświetlić wynik ze znakiem minus w przypadku mniejszej ilości godzin niż 8 a następnie zsumować ilość tych nadgodzin w skali tygodnia/miesiąca/ itp.
Nie za bardzo wiem jak się za to zabrać do jakiego formatu prze konwertować tego stringa aby np zsumowane godziny w skali miesiąca potrafił pokazać jako np: 30:00 godzin a nie 1 dzień i 6 godzin.
Proszę o pomoc jak sobie z tym poradzić.
Pozdrawiam

1

TimeSpan zawiera wszystko czego potrzebujesz:

TimeSpan time = TimeSpan.Parse("06:00");
TimeSpan diff = time.Add(TimeSpan.FromHours(-8));
double hours = diff.TotalHours;

EDIT:
usunąłem niepotrzebną Tobie część

0
mk77 napisał(a):

Mam w bazie zapisany jako string czas przepracowany danego dnia w postaci gg:mm.

Mssql ma typ time i takiego właśnie typu powinieneś użyć w tym polu. String jest cierpliwy i zniesie dowolne śmieci, np. "08.00", "8h", "8h0m", "480m", "dupa", "ab:cd".

0

zrobiłem w ten sposób

TimeSpan time = TimeSpan.Parse(zmienna z bazy);
TimeSpan diff = time.Add(TimeSpan.FromHours(-8));

aby mieć czas podany w formacie gg:mm to zrobiłem
string diff = time.ToString();
dzienne czasy podaje mi prawidłowo np: 0000 lub -0100
gdy zrobię sumę wszystkich cząstkowych czasów
total += time;
to przepełnia mi się licznik godzin o dostaję w postaci np: 2.2000 gdzie 2.20 oznacza 2 dni i 20 godzin a chciał bym taki wynik otrzymać w postaci: 6800

0

Oto mój sklecony na szybko kod testujący.

            var times = new[] {
                new TimeSpan(1, 0, 0),
                new TimeSpan(0, -50, 0),
                new TimeSpan(0, -30, 0),
                new TimeSpan(-1, -45, 0),
            };

            var result = times.Aggregate<TimeSpan>((r,t) => r.Add(t));
            
            var minus = result < TimeSpan.Zero ? "-" : "";
            var s = string.Format("{0}{1:00}:{2:00}", minus, Math.Abs(result.TotalHours), Math.Abs(result.Minutes));

Zawsze możesz też parsować, pobierać minuty przez TotalMinutes, przeliczać i podzielić przez 60:

godziny = liczba_minut / 60 (dzielenie całkowite)
minuty = liczba_minut % 60 (modulo)

Potem tylko string.Format i po sprawie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1