我必须在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
答案 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 Strings和Custom TimeSpan Format Strings
答案 4 :(得分:0)
30.97是正确的值,但不是HH:mm格式。
对我来说正确的解决方法是:
var total = Math.Floor( totaleOreMarcaTempo.TotalMinutes / 60).ToString() + ":" + Math.Floor( totaleOreMarcaTempo.TotalMinutes % 60).ToString();