TimeSpan ToString格式


95

只是好奇,是否可以使用格式字符串输出“ 5h 3m 30s”之类的内容?

例如。(显然是错误的)

myTimeSpan.ToString("hh mm ss")

Answers:


143

尝试:

myTimeSpan.ToString("h'h 'm'm 's's'")

(请注意,即使空格也需要加引号-这就是我的第一次尝试。)

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

编辑:如前所述,这将不会超过24小时。另请注意,也可以通过Noda Time获得替代方法:)


5
请参阅Dimension的答案,因为此答案无法正确格式化24小时或更长时间的时间。
斯科特,

“ dd'd'hh'h'mm'm'”-这对我有用。请注意,您需要使用带撇号的格式文本包装:“ dd'days days'”。dd是数据的安全性,“花费了您自己的文本的天数”
Pavel Shkleinik 2013年

37

使用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天转换为小时,只会将它们切断,就好像它们不存在一样。

解决此问题的一种方法是创建一个扩展程序,该扩展程序检查TimeSpan的长度并根据时间跨度是否超过一年,一天等来创建格式。或者您也可以只显示日期,因为它们永远不会中断:

string newFormat = span.ToString("d'd 'h'h 'm'm 's's'");

请注意,我是编程的初学者。这只是来自观察,因为我很幸运在假设它可以显示所有小时数之后注意到了这一点。我之所以这样说,是因为我不知道是否有更好的解决方案,例如另一种可以显示无穷小时数的小时格式。

但是我确实认为这种格式正在实现其预期的功能。您只需要意识到这一点。因此,这个职位。乔恩·斯凯特(Jon Skeet)的回答从未表明这种格式仅显示日期类型格式的hour属性,其中小时最多为23。


14
这就是为什么TotalHours在TimeSpan中有其他内容的原因。您可能想要这个Math.Floor(span.TotalHours) + span.ToString("'h 'm'm 's's'")
Aximili

17

如果您很不幸没有使用.NET4,请执行以下操作:

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

9
对于需要支持> 24h的代码,TotalHours即使在较新版本的.net中,此解决方案仍然是可行的方法。
CodesInChaos

1
实际上,我觉得更好,因为您可以信任它。
克里斯·马里西奇

当心,如果使用TotalHours,因为这是一个double,而不是intHours就是,也就是说,它会显示的时间分数以及整个小时。
Jinlye

6

浓缩的效果如何:

String oTime = myTimeSpan.ToString("h") + "h " +
               myTimeSpan.ToString("m") + "m " +
               myTimeSpan.ToString("s") + "s "

更新1:

您可以使用单引号将其转义: h'h 'm'm 's's'


11
如果你要使用级联,你不妨使用HoursMinutesSecondsIMO性能。在弄清楚引号之后,我个人宁愿使用自定义格式字符串。
乔恩·斯基特

6

这个小代码有助于解析和回退:

        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;

参考时间跨度解析



2

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.