多个TimeSpan的总和

时间:2018-08-06 07:35:23

标签: c# .net timespan

我必须在DataTable中进行更多时间跨度的总和才能使用下面的代码,但是总和是错误的,这是由于以下原因造成的:

DataTable(dt)值:

    09:21
    08:28
    08:46
    04:23

Total hours: 30,97 //97 minutes is not correct

C#代码:

 TimeSpan totaleOreMarcaTempo = TimeSpan.Zero;
 int conta = 0;     
 foreach (DataRow dr in dt.Rows)
 {  
    String OreMarcaTempo = tm.ConteggioOreGiornaliere(dr["Data"].ToString()); //This string contains at each cycle 09:21 08:28 08:46 04:23
    TimeSpan oreMarcatempo = TimeSpan.Parse(OreMarcaTempo.ToString());
    totaleOreMarcaTempo = totaleOreMarcaTempo + oreMarcatempo;
    conta++;
 }
  labelTotaleOreMarcaTempoMod.Text = "" + (int)totaleOreMarcaTempo.TotalHours + ":" + totaleOreMarcaTempo.Minutes.ToString(); //30:58

5 个答案:

答案 0 :(得分:9)

30.97是正确的小时数。它不是 意思是“ 30小时97分钟分钟”。

30.97小时 30小时58分钟。 58/60大约是0.97。

我认为您只需要正确格式化字符串即可。格式化的一种方法是:

@"{(int)yourTimeSpan.TotalHours}:{yourTimeSpan.Minutes}"

答案 1 :(得分:6)

30.97是正确的(30.97小时,其中0.97是小时(60分钟* 0.97 = 58分钟)),
您只需要将TotalHours的分数转换为分钟即可。

var raw = "09:21 08:28 08:46 04:23";
var totalTimespan = 
    raw.Split(" ")
       .Select(TimeSpan.Parse)
       .Aggregate(TimeSpan.Zero, (total, span) => total += span);

// Use integer value of TotalHours
var hours = (int)totalTimespan.TotalHours;
// Use actual minutes
var minutes = totalTimespan.Minutes


var output = $"{hours}:{minutes}";

var expected = "30:58";
output.Should().Be(expected); // Pass Ok

答案 2 :(得分:2)

您必须更改格式。 0,98小时= 58,2分钟

labelTotaleOreMarcaTempoMod.Text =string.Format ("{0:00}:{1:00}:{2:00}", 
           (int)totaleOreMarcaTempo.TotalHours, 
                totaleOreMarcaTempo.Minutes, 
                totaleOreMarcaTempo.Seconds); 

答案 3 :(得分:1)

要“正确”打印出TimeSpan,只需使用正确的格式:

labelTotaleOreMarcaTempoMod.Text = totaleOreMarcaTempo.ToString("c");

labelTotaleOreMarcaTempoMod.Text = totaleOreMarcaTempo.ToString("hh':'mm");

编辑请注意(谢谢,盆地)第二种形式忽略了天。

参考:Standard TimeSpan Format StringsCustom TimeSpan Format Strings

答案 4 :(得分:0)

30.97是正确的值,但不是HH:mm格式。

对我来说正确的解决方法是:

 var total = Math.Floor( totaleOreMarcaTempo.TotalMinutes / 60).ToString() + ":" + Math.Floor( totaleOreMarcaTempo.TotalMinutes % 60).ToString();