LINQ C#-如何使用timespan显示超过24小时

LINQ C#-如何使用timespan显示超过24小时,c#,linq,C#,Linq,我有这行代码: TalkTime = TimeSpan.FromMinutes((int)g.Sum(b => b.Field<int?>("talkTime"))).ToString("hh':'mm':'ss") TalkTime=TimeSpan.frommins((int)g.Sum(b=>b.Field(“TalkTime”)).ToString(“hh':'mm':'ss”) 我需要将时间显示为总小时数。例如,使用totalHours可以得到54.33。我需要5

我有这行代码:

TalkTime = TimeSpan.FromMinutes((int)g.Sum(b => b.Field<int?>("talkTime"))).ToString("hh':'mm':'ss")
TalkTime=TimeSpan.frommins((int)g.Sum(b=>b.Field(“TalkTime”)).ToString(“hh':'mm':'ss”)
我需要将时间显示为总小时数。例如,使用totalHours可以得到54.33。我需要54:33:00


有什么建议吗?

54:33:00!=54小时20分零秒

我认为你的逻辑可能是错的,因为你打算输出的是双倍的,而不是正确的分钟数

// Get your timespan (using the same number of minutes as expected)
var timespan = TimeSpan.FromMinutes(3260);
// This would output a double and not a string
timespan.TotalMinutes; // yields 55.3333 (i.e. 54 hours and 1/3 or 20 minutes)
因此,我不认为您真的希望输出
54:33:00
,因为这是不正确的,因为这意味着54小时33分钟,而不是正确的54小时20分钟,您可以通过以下方法执行:

因此,原始代码的示例可能如下所示:

var talktime = TimeSpan.FromMinutes((int)g.Sum(b => b.Field<int?>("talkTime")));
// Use your talktime to set your proper string variable
TalkTime = String.Format("{0:00}:{1:00}:{2:00}",(int)talktime.TotalHours, talktime.Minutes,0);
var talktime=TimeSpan.frommins((int)g.Sum(b=>b.Field(“talktime”));
//使用talktime设置适当的字符串变量
TalkTime=String.Format(“{0:00}:{1:00}:{2:00}”,(int)TalkTime.TotalHours,TalkTime.Minutes,0);

您可以。

TimeSpan。TotalHours
以小时为单位返回
TimeSpan
实例中的当前时间。所以0.33是0.33分,不是33分钟。使用数学和自定义格式,您可以实现您想要做的事情。以下是一个例子:

    var time = new TimeSpan(54, 21, 0);
    var hours = System.Math.Floor(time.TotalHours);
    var minutes = System.Math.Ceiling((time.TotalHours - hours) * 60); // you can also use time.Minutes
    Console.WriteLine(string.Format("{0:00}:{1:00}:{2:00}", hours, minutes, 0));

这将使用
TotalHours
属性的
Floor
来确定小时分量,并通过将
TotalHours
属性的分数乘以60来计算分钟分量。您还可以使用
time.Minutes
作为分钟组件。

TotalHours的值54.33并不意味着54小时33分钟,它意味着54小时+33/100小时,即54小时33*60/100分钟,即54小时19.8分钟,或54小时19分钟+0.8*60秒=48秒。所以54.33小时是54:19:48

假设要将十进制54.33的值显示为字符串54:19:48,我想最好的方法是创建一个同时实现IFormatProvice和iCustomFormatter的类。ICustomFormatter.Format函数将以与上述相同的方式为您进行格式化:

  • 计算总小时数,然后用数学。Floor四舍五入到小时数
  • 使用CultureInfo.DateTimeFormatInfo调查是否添加分号或正斜杠,或任何奇怪的字符
  • 使用余数*60计算(十进制)分钟数
  • 再次:Math.Floor计算完整分钟数,余数得到秒数
  • 执行相同操作以获取秒数和毫秒数

举一个例子,说明如何在ICustomFormatter.Format中避免对
timespan.TotalHour
205.75->206
)进行取整,请将其转换为
int
String.Format(“…”,(int)timespan.TotalHours,…)很好,我已经做了相应的添加。好的。我更改了代码,但出现了错误。如何在linq代码中实现它:hours=TimeSpan.FromSeconds((int)g.Sum(b=>b.Field(“talkTime”))。TotalHours,minutes=TimeSpan.FromSeconds((int)g.Sum(b=>b.Field(“talkTime”))。TotalMinutes,seconeds=TimeSpan.FromSeconds((int)g.Sum)(b=>b.Field(“talkTime”)).TotalSeconds,talkTime=string.Format(“{0:00}:{1:00}:{2:00}”,小时,分钟,秒),我认为您误解了
Total
属性。您似乎认为
TotalHours
将包含小时组件,
TotalMinutes
将包含分钟组件。这不是真的,这些属性以属性的单位保存总时间。例如,如果
TimeSpan
返回2对于
TotalHours
,这意味着对于
TotalMinutes
它将返回120,对于
TotalSeconds
它将返回7200。因此,如果将属性转换为相同的单位(例如毫秒或节拍),那么它们将产生相同的结果。请尝试以下操作:var time=TimeSpan.FromSeconds((int)g.Sum(b=>b.Field(“talkTime”));var hours=System.Math.Floor(time.TotalHours);var minutes=System.Math.天花((time.TotalHours-hours)*60);Console.WriteLine(string.Format(“{0:00}:{1:00}:{2:00}”,小时,分钟,0));
    var time = new TimeSpan(54, 21, 0);
    var hours = System.Math.Floor(time.TotalHours);
    var minutes = System.Math.Ceiling((time.TotalHours - hours) * 60); // you can also use time.Minutes
    Console.WriteLine(string.Format("{0:00}:{1:00}:{2:00}", hours, minutes, 0));