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