С# DateTime + TimeSpan = дополнительные 12 часов?

Я хочу регистрировать время, потраченное на работу, и я хотел бы накапливать это время по многим записям для работы над одной и той же работой в разное время дня.

У меня есть запись времени и добавление разницы во времени, и это работает ... за исключением того, что мой вывод выглядит так:

Original Time: 00:00:30
Addition Time: 00:00:10
TotalTime Out: 12:00:40

В этой строке кода:

totTime.Text = dt4.ToString("hh:mm:ss");

Если я не добавлю чч: мм: сс, он складывается правильно, но включает дату, которая мне на самом деле не нужна. Если это поможет сузить круг.

Кто-нибудь знает, почему здесь добавлено 12 часов? Я вообще не вижу причин для этого.

Мой код для получения записей о времени и вычисления разницы выглядит следующим образом:

public void startbutton_Click(object sender, EventArgs e)
        {

            startTime.Text = DateTime.Now.ToString("hh:mm:ss");

        }

public void stopbutton_Click(object sender, EventArgs e)
        {

            stopTime.Text = DateTime.Now.ToString("hh:mm:ss");

            DateTime dt1 = DateTime.ParseExact(startTime.Text, "hh:mm:ss", new DateTimeFormatInfo());
            DateTime dt2 = DateTime.ParseExact(stopTime.Text, "hh:mm:ss", new DateTimeFormatInfo());

            TimeSpan ts1 = dt2.Subtract(dt1);

            diffTime.Text = ts1.ToString();

            if (String.IsNullOrEmpty(totTime.Text))
            {
                totTime.Text = ts1.ToString();
            }
            else if (totTime.Text != "")
            {
                DateTime dt3 = DateTime.ParseExact(diffTime.Text, "hh:mm:ss", new DateTimeFormatInfo());

                DateTime dt4 = dt3 + ts1;
                totTime.Text = dt4.ToString("hh:mm:ss");
            }

Спасибо.


person Community    schedule 28.11.2020    source источник
comment
Вместо того, чтобы анализировать строку для получения времени, сохраните их как DateTime сущности. Добавьте элемент startDateTime и установите его в своем первом методе. Делайте все свои расчеты в DateTimes и TimeSpans. Преобразовывать только в строки для отображения   -  person Flydog57    schedule 29.11.2020
comment
Я уверен, что вы правы, но на самом деле это не объясняет, откуда берутся эти 12 часов... или почему они не появляются, если я разрешаю писать дату и время (удалив чч:мм:сс).. .так это выглядит так: 28/11/2020 00:00:07 - это добавило 3 и 4 секунды вместе... нет проблем.   -  person    schedule 29.11.2020


Ответы (2)


К измеренному времени не добавляются 12 часов. Вы просто отображаете TimeSpan как время суток.

Здесь вы конвертируете TimeSpan в строку и записываете ее в diffTime.Text:

        TimeSpan ts1 = dt2.Subtract(dt1);
        diffTime.Text = ts1.ToString();

Здесь вы анализируете diffTime.Text как DateTime:

            DateTime dt3 = DateTime.ParseExact(diffTime.Text, "hh:mm:ss", new DateTimeFormatInfo());

Анализ TimeSpan как DateTime в корне неверен. Если TimeSpan равен 40 секундам, и вы анализируете его как DateTime, результирующее время дня — это 40 секунд после полуночи, то есть 00:00:40. Это то, что вы видите на экране.

Как предложил @Flydog57, сделайте все расчеты, используя DateTime и TimeSpan. Только окончательный результат должен быть преобразован в текст и отображен.

person RaceRalph    schedule 28.11.2020

Ок, понял спасибо за пояснение.

Я думал, что у меня это было раньше, но это не так... но в конце концов я нашел решение.

Это код, который работает и накапливается по мере того, как я работаю... и это немного проще, чем пытаться передавать переменные...

public void stopbutton_Click(object sender, EventArgs e)
        {
            DateTime dts1 = DateTime.ParseExact(startTime.Text, "hh:mm:ss", new DateTimeFormatInfo());
            DateTime dts2;

            dts2 = DateTime.Now;

            stopTime.Text = dts2.ToString("hh:mm:ss");

            TimeSpan ts1 = dts1.Subtract(dts2);
            
            diffTime.Text = ts1.ToString(@"hh\:mm\:ss");

            if (String.IsNullOrEmpty(totTime.Text))
            {
                totTime.Text = diffTime.Text;
            }
            else if (totTime.Text != "")
            {
                TimeSpan ts2 = TimeSpan.Parse(diffTime.Text);
                TimeSpan ts3 = TimeSpan.Parse(totTime.Text);

                TimeSpan ts4 = ts2 + ts3;

                totTime.Text = ts4.ToString(@"hh\:mm\:ss");
            }
person Community    schedule 29.11.2020