Program do zliczania różnicy czasu

0

Witam

Muszę napisać program który zwróci mi różnicę czasu pomiędzy godziną wpisaną w polu nr 1 a godziną wpisaną w polu numer 2. Wpadłem na prosty pomysł, że będzie odejmować liczby we wpisanej kolumnie tekstowej. Tylko problem jest w tym - jak je sczytać. Przykładowo - screenshot-20201001151422.png

Czyli:
Godziny: 12 - 12 = 0
Minuty: 53 - 15 = 38
Sekundy: 10 - 02: = 08

Tak więc wynik ma wyjść 008.

Zatem jak tutaj się za to zabrać aby to jakoś wyglądało? Czy może jest jeszcze jakiś inny ciekawszy pomysł na to?

0

1200
1300
a to jak odejmiesz?

6

Jeżeli ciebie intersuje takie odejmowanie to szukaj split

Mozna jednak prościej:

DateTime dt1 = DateTime.ParseExact(time1, "HH:mm:ss", new DateTimeFormatInfo());
DateTime dt2 = DateTime.ParseExact(time2, "HH:mm:ss", new DateTimeFormatInfo());
TimeSpan ts = dt1.Subtract(dt2);
2

Polecam zamiast rzeźbić to ręcznie wpisać w google date parser c# (albo time parser c#). Jak już będziesz miał dwie sparsowane daty to ustalasz która większa. Od większej odejmujesz mniejszą i potem kombinujesz jak przerobić ten interwał na czas czytelny dla człowieka

1

Na marginesie: przy jakiejś okazji, instalując produkt .NET, zobaczyłem bibliotekę NodaTime.DLL, oczywiście nos Javowca zwietrzył analogię do JodaTime.

W Javie motywacje były BARDZO jasne: fatalny projekt ówczesnego fabrycznego pakietu do daty/czasu. (a, co wszyscy wiemy, Joda obecnie zostało z minimalnymi zmianami wchłonięte w wersji 8 języka)

Ciekawe, ze .NETowcy też byli głodni czegoś analogicznego.
C# powstając 10-12 lat po starszym bracie miał szansę (i wykorzystał) okazję do unikniecia paru głupot.
Do tej pory nie miałem świadomości, że kogoś fabryczne C# date & time męczy
Właśnie zerkam w dokumentację Noda Time, czy znajdę cięższe zarzuty.

2

@AnyKtokolwiek:

Pytanie jak bardzo Noda jest popularna

Bo poza Jon Skeetem to chyba nigdy nie widziałem aby ktoś o niej wspomniał/użył

1

W jednym z projektów kolega użył po obejrzeniu prezentacji Skeeta. Po dwóch dniach ją usunąłem bo do tego co zrobił nie potrzeba było dodatkowej zależności.

0

Ktoś potrzebował do CV, to sobie zrobił zbędną bibliotekę. Pełno takich w necie.

0

Jest z fabrycznym DateTime związany taki koncept, żeby zawierał konglomerat roku i miesiąca?

Czyli żeby nie pisać takich sprawdzeń przynależenia do miesiąca

DateTime d1, d2 
... żeby nie pisać 
if(d1.Year==d2.year && d1.Month==d2.Month)

bo w javowskim Joda jest

0
/// <summary>
        /// Zwraca różnicę czasu między dwiema godzinami
        /// </summary>
        /// <param name="time1">(HH:mm:ss)</param>
        /// <param name="time2">(HH:mm:ss)</param>
        /// <returns></returns>
        public TimeSpan difference(string time1, string time2)
        {
            string[] words1 = time1.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries);
            if (words1.Count() != 3)
                throw new ArgumentException();
            TimeSpan t1 = new TimeSpan(
                    int.Parse(words1[0]), // godzina
                    int.Parse(words1[1]), // minuta
                    int.Parse(words1[2])); // sekunda

            string[] words2 = time2.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries);
            if (words2.Count() != 3)
                throw new ArgumentException();
            TimeSpan t2 = new TimeSpan(
                    int.Parse(words2[0]), // godzina
                    int.Parse(words2[1]), // minuta
                    int.Parse(words2[2])); // sekunda

            return (t1.Ticks > t2.Ticks) ? new TimeSpan(t1.Ticks - t2.Ticks) : new TimeSpan(t2.Ticks - t1.Ticks);

        }

Przykład:

string time1 = "12:53:24";
string time2 = "13:58:12";
Console.WriteLine(difference(time1, time2).ToString());

Może pomoże :)

2

@up: tylko po co męczyć się z ręcznym parsowaniem i sprawdzaniem co jest większe a co mniejsze zamiast skorzystać z wbudowanych możliwości?

                var timeFormat = "hh\\:mm\\:ss";
		var t1 = TimeSpan.ParseExact("12:35:57", timeFormat, CultureInfo.InvariantCulture);
		var t2 = TimeSpan.ParseExact("11:13:46", timeFormat, CultureInfo.InvariantCulture);
		
		var t3 = t1.Subtract(t2).Duration();			
		Console.WriteLine(t3); // 01:22:11

		var t4 = t2.Subtract(t1).Duration();
		Console.WriteLine(t4); // 01:22:11
0

Bo jestem wirtuozem si szarpa XD w sumie korzystam z tego ale chciałem pokazać na czytelnym przykładzie jak to działa

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