【问题标题】:Conversion of string into timespan with Sum使用 Sum 将字符串转换为时间跨度
【发布时间】:2018-07-27 15:57:11
【问题描述】:

您好,我必须执行总和,为此我使用下面的代码 c#:首先将 hourtot 转换为时间跨度,然后执行总和,最后我得到 08:30 的总和,这是不可能的,我该如何解决这个问题?是什么原因造成的?

C# 代码:

    /*
    hourtot values:
    08:30
    10:00
    09:00
    08:30
    10:00
    10:30*/

TimeSpan tot= TimeSpan.Zero;
 foreach (DataRow dr in dt.Rows)
 {
    String hourtot= r.CaricaOreGiornaliere(dr["date"].ToString());
    if(hourtot.Equals("00:00") == false)
    {
      TimeSpan hourcant= TimeSpan.Parse(hourtot.ToString());
      tot= tot+ hourcant;
    }
    }
   labelris.text = "" + tot.ToString(@"hh\:mm"); //this print 08:30

【问题讨论】:

  • 是的,我确定...
  • tot.ToString() 打印出什么?
  • 如果您想在几天、几小时和几分钟内得到答案,您可以使用:tot.ToString(@"d\.hh\:mm")
  • ToString(@"hh\:mm");正在截断小时 > 24 小时。请参阅:stackoverflow.com/questions/3505230/…
  • 改用string.Format("{0}:{1}", (int)tot.TotalHours, tot.Minutes)

标签: c# .net timespan


【解决方案1】:

问题出在您的tot.ToString(@"hh\:mm"); 行。

当您使用hhmm 时,它使用您的TimeSpan 对象的HoursMinutes 值,而不是您想要的TotalHoursTotalMinutes

因此,如果您的总小时数超过一天,则将前 24 小时作为一天。例如,如果您的总时间为 27 小时,那么您的 TimeSpan.Days 将是 1,而 TimeSpan.Hours 将是 3

这是您的完全相同的程序,但编写为一个简单的控制台程序。

static void Main(string[] args)
{
    List<string> times = new List<string>();
    times.Add("08:30");
    times.Add("10:00");
    times.Add("09:00");

    TimeSpan tot = TimeSpan.Zero;
    foreach (var time in times)
    {
        if (time.Equals("00:00") == false)
        {
            TimeSpan hourcant = TimeSpan.Parse(time);
            tot = tot + hourcant;
        }
    }

    Console.WriteLine(tot.ToString(@"hh\:mm"));

    Console.ReadLine();
}

输出是

03:30

但是,在调试器中查看tot 的值。

所以你的方法很好,你需要更好地打印它。 像这样的:

Console.WriteLine("Total Hours = {0}", tot.TotalHours);

编辑:

使用下面 Matthew Watson 的建议将以您想要的确切格式给出输出。

Console.WriteLine(tot.ToString(@"d\.hh\:mm"));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多