C# TimeSpan-ToString格式

C# TimeSpan-ToString格式,c#,.net,C#,.net,只是好奇,有没有一个格式字符串可以用来输出像“5h 3m 30s”这样的东西 (显然错了) 尝试: (注意,即使是空格也需要引用——这就是我第一次尝试的错误之处。) 当然,我假设您使用的是.NET4,在此之前,TimeSpan不支持自定义格式字符串 编辑:如前所述,这将在24小时后生效。还要注意的是,也可以通过以下途径获得替代方案:)Concatenation如何: String oTime = myTimeSpan.ToString("h") + "h " + m

只是好奇,有没有一个格式字符串可以用来输出像“5h 3m 30s”这样的东西

(显然错了)

尝试:

(注意,即使是空格也需要引用——这就是我第一次尝试的错误之处。)

当然,我假设您使用的是.NET4,在此之前,
TimeSpan
不支持自定义格式字符串


编辑:如前所述,这将在24小时后生效。还要注意的是,也可以通过以下途径获得替代方案:)

Concatenation如何:

String oTime = myTimeSpan.ToString("h") + "h " +
               myTimeSpan.ToString("m") + "m " +
               myTimeSpan.ToString("s") + "s "
更新1:


你可以用单引号来转义:
h'h'm's'

使用Jon Skeet的答案时要注意这一点,代码如下:

// 12 days, 23 hours, 24 minutes, 2 seconds.
TimeSpan span = new TimeSpan(12, 23, 24, 2);
// 27 hours, 24 minutes, 2 seconds
TimeSpan span2 = new TimeSpan(27,24,2);

string format = span.ToString("h'h 'm'm 's's'");
string format2 = span2.ToString("h'h 'm'm 's's'");
Console.WriteLine(format);
Console.WriteLine(format2);
Console.ReadLine();
结果如下:

23h 24m 2s
3h 24m 2s
小时格式最多可显示23小时。它不会显示27小时,也不会将12天转换为小时,它只会简单地将它们切断,就好像它们从未存在过一样

解决此问题的一种方法是创建一个扩展,用于检查时间跨度的长度,并根据时间跨度是否超过一年、一天等创建格式。或者,您也可以简单地显示日期,因为它们从不中断:

string newFormat = span.ToString("d'd 'h'h 'm'm 's's'");
请注意,我是编程初学者。这只是在我很幸运地注意到这一点后,才从观察中得出的,因为我假设它会显示所有的时间。我这么说是因为我不知道是否有更好的解决方案,比如另一种可以显示无限小时的小时格式


然而,我确实认为这种格式正在发挥其预期的功能。你只需要意识到这一点。因此这篇文章。Jon Skeet的回答从未表明此格式仅显示日期类型格式的hour属性,其中小时数最多为23。

如果您不幸没有使用。NET4:

string.Format("{0}h{1}m{2}s",
    myTimeSpan.Hours,
    myTimeSpan.Minutes,
    myTimeSpan.Seconds);

这个小代码示例应该可以帮助您解析和反向解析TimeSpan:

var t = TimeSpan.FromMilliseconds(450780);
double d1 = t.TotalSeconds;
string t3 = t.ToString(@"hh\:mm\:ss\.f",null);
var tt = TimeSpan.ParseExact(t3, @"hh\:mm\:ss\.f",null);
double d2 = tt.TotalSeconds;

参考资料:

使用
Xamarin
.NET Portable 4.5
这是我在这里尝试了所有其他答案后唯一使用的格式:

timespan.ToString("hh':'mm':'ss");

本质上,我将
放在单引号中以转义它们。

我有时会发现格式字符串有点像正则表达式,因为当我稍后回到代码时,我已经忘记了细微差别。因此,我选择了以下内容,这不太可能将文档发回给我:

string FormatTimeSpan(TimeSpan timeSpan) =>
    $"{Math.Floor(timeSpan.TotalHours)}h {timeSpan.Minutes}m {timeSpan.Seconds}s";

C#6中引入的字符串插值使这一点更加清晰。

如果要使用串联,最好使用
Hours
Minutes
Seconds
属性。我个人更愿意使用自定义格式的字符串,在计算出报价后。这就是为什么在时间跨度内有
TotalHours
etc。你可能想要这个
Math.Floor(span.TotalHours)+span.ToString('h'm'm's')
See Dimension的答案,因为这个不能正确格式化24小时或更长的时间。“dd'd'hh'mm'm'”-这对我有用。考虑到你需要用撇号“dd'days Wasted'”来包装格式化文本。在这里,dd是数据的和平,对于需要支持>24小时的代码,您自己的文本“花费了多少天”。即使在较新版本的.net中,使用
TotalHours
的解决方案仍然是可行的。事实上,我发现这样做更好,因为您可以信任它。如果使用
TotalHours
,请小心,因为这是一个
双倍
,不像
Hours
那样的
int
是,也就是说,它将显示小时的分数和整小时。
timespan.ToString("hh':'mm':'ss");
string FormatTimeSpan(TimeSpan timeSpan) =>
    $"{Math.Floor(timeSpan.TotalHours)}h {timeSpan.Minutes}m {timeSpan.Seconds}s";