C# DateTime + TimeSpan = 额外 12 小时?

C# DateTime + TimeSpan = an extra 12 hours?

我想记录在某项工作上花费的时间,并且我想在一天中不同时间从事同一工作的许多条目中累积该时间。

我用它记录时间,并将时差加在一起,它起作用了....除了我的输出看起来像这样:

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

谢谢。

您的测量时间没有增加 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 秒,即 12:00:40 AM。这就是您在屏幕上看到的。

正如@Flydog57 所建议的那样——使用 DateTime 和 TimeSpan 进行所有计算。只需要将最终结果转为文本显示即可。

好的,明白了谢谢你的解释

我以为我早点找到了,但我没有....但我最终找到了解决方案。

这是我运行和积累的代码...比尝试传递变量要容易一些...

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