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

#c# #datetime #timespan

#c# #datetime #временной интервал

Вопрос:

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

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

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

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

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

Если я не добавлю «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");
            }
 

Спасибо.

Комментарии:

1. Вместо того, чтобы анализировать строку для получения времени, сохраняйте их как DateTime объекты. Добавьте startDateTime элемент и установите его в своем первом методе. Выполняйте все свои вычисления в DateTimes и TimeSpans. Преобразование только в строки для отображения

2. Я уверен, что вы правы, но на самом деле это не объясняет, откуда берутся эти 12 часов … или почему они не отображаются, если я разрешаю ему записывать дату и время (удаляя «hh: mm: ss») … так что это выглядит так: 28/11/2020 00:00:07- это добавило 3 и 4 секунды together…no проблема.

Ответ №1:

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

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

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

Здесь вы анализируете diffTime.Текст как дата и время:

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

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

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

Ответ №2:

Хорошо, понял, спасибо за объяснение.

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

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

 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");
            }