61

我有两个文本框。一个用于打卡,一个用于打卡。时间将采用以下格式:

Hours:Minutes

假设我在上午 7:00 打卡并在下午 2:00 打卡。

使用我当前的代码,我得到了 2 小时的差异,但应该是 7 小时。我将如何在 C# 中做到这一点。我打算通过让用户选择上午或下午来转换为 24 小时制,但我感到困惑。

那么,基本上,我将如何计算两次之间的小时差?

我试过这个,但是当我输入数字时得到了 2 个小时而不是 7 个小时。

DateTime startTime = Convert.ToDateTime(textBox1.Text);
DateTime endtime = Convert.ToDateTime(textBox2.Text);

TimeSpan duration = startTime - endtime;
4

5 回答 5

103
string startTime = "7:00 AM";
string endTime = "2:00 PM";

TimeSpan duration = DateTime.Parse(endTime).Subtract(DateTime.Parse(startTime));

Console.WriteLine(duration);
Console.ReadKey();

将输出:07:00:00。

如果用户输入军事时间,它也可以工作:

string startTime = "7:00";
string endTime = "14:00";

TimeSpan duration = DateTime.Parse(endTime).Subtract(DateTime.Parse(startTime));

Console.WriteLine(duration);
Console.ReadKey();

输出:07:00:00。

要更改格式: duration.ToString(@"hh\:mm")

更多信息请访问:http: //msdn.microsoft.com/en-us/library/ee372287.aspx

附录:

多年来,这是我曾经给出的最受欢迎的答案,这让我有些困扰;最初的答案从未真正解释为什么 OP 的代码不起作用,尽管它完全有效。它获得如此多选票的唯一原因是,当人们搜索“C#”、“时间跨度”和“介于”这些术语的组合时,该帖子会出现在 Google 上。

于 2012-09-20T21:47:26.803 回答
18

您可以使用TimeSpan构造函数,它需要很长时间的 Ticks:

 TimeSpan duration = new TimeSpan(endtime.Ticks - startTime.Ticks);
于 2012-09-20T21:46:37.650 回答
4

两点:

  1. 检查您的输入。我无法想象通过减去您正在谈论的时间值来获得 2 小时的情况。如果我这样做:

        DateTime startTime = Convert.ToDateTime("7:00 AM");
        DateTime endtime = Convert.ToDateTime("2:00 PM");
        TimeSpan duration = startTime - endtime;
    

    ...我得到-07:00:00了结果。即使我忘记提供 AM/PM 值:

        DateTime startTime = Convert.ToDateTime("7:00");
        DateTime endtime = Convert.ToDateTime("2:00");
        TimeSpan duration = startTime - endtime;
    

    ......我明白了05:00:00。因此,要么您的输入不包含您列出的值,要么您处于以意外方式开始解析它们的机器环境中。或者你实际上并没有得到你报告的结果。

  2. 要找到开始时间和结束时间之间的差异,您需要这样做endTime - startTime,而不是相反。

于 2012-09-20T21:46:13.077 回答
1

如果我在某个时候通过排序的时间列表(如时间表列表)旋转,我需要获得最后一次和第一次之间的间隔,到目前为止我得出了这个解决方案:

  TimeSpan t1 = TimeSpan.Parse("23:00");
  TimeSpan t2 = TimeSpan.Parse("3:10");
  double _24h = (new TimeSpan(24, 0, 0)).TotalMilliseconds;
  double diff = t2.TotalMilliseconds - t1.TotalMilliseconds;
  if (diff < 0) diff += _24h;
  Console.WriteLine(TimeSpan.FromMilliseconds(diff)); // output: 04:10:00
于 2021-11-09T19:23:20.990 回答
0

另一种方式(更长)在 VB.net [说 2300 开始和 0700 第二天完成]

如果 tsStart > tsFinish 那么

                            ' Take Hours difference and adjust accordingly
                            tsDifference = New TimeSpan((24 - tsStart.Hours) + tsFinish.Hours, 0, 0)

                            ' Add Minutes to Difference
                            tsDifference = tsDifference.Add(New TimeSpan(0, Math.Abs(tsStart.Minutes - tsFinish.Minutes), 0))


                            ' Add Seonds to Difference
                            tsDifference = tsDifference.Add(New TimeSpan(0, 0, Math.Abs(tsStart.Seconds - tsFinish.Seconds)))
于 2014-03-25T17:08:46.797 回答