C# odejmowanie godzin - wyliczanie nadgodzin

C# odejmowanie godzin - wyliczanie nadgodzin
M7
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 33
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

Sarrus
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2512
1

TimeSpan zawiera wszystko czego potrzebujesz:

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

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

ŁF
  • Rejestracja: dni
  • Ostatnio: dni
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".

M7
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 33
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: 00:12:00 lub -01:10:00
gdy zrobię sumę wszystkich cząstkowych czasów
total += time;
to przepełnia mi się licznik godzin o dostaję w postaci np: 2.20:10:00 gdzie 2.20 oznacza 2 dni i 20 godzin a chciał bym taki wynik otrzymać w postaci: 68:10:00

Sarrus
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2512
0

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

Kopiuj
            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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.