109

只是好奇,有没有可以用来输出“5h 3m 30s”之类的格式字符串?

例如。(显然错了)

myTimeSpan.ToString("hh mm ss")
4

7 回答 7

154

尝试:

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

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

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

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

于 2012-06-18T06:13:48.733 回答
44

使用 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 的回答从未表明此格式仅显示日期类型格式的小时属性,其中小时数最多为 23。

于 2013-03-30T15:57:05.813 回答
21

如果你很不幸没有使用 .NET4:

string.Format("{0}h{1}m{2}s",
    myTimeSpan.Hours,
    myTimeSpan.Minutes,
    myTimeSpan.Seconds);
于 2013-08-23T16:23:15.330 回答
11

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

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

本质上,我将单引号放在:单引号中以逃避它们。

于 2017-03-10T15:14:28.083 回答
8

这个小代码示例应该可以帮助您解析和反向解析 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;

参考:自定义 TimeSpan 格式字符串

于 2014-11-07T16:22:09.357 回答
6

如何连接:

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

更新 1:

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

于 2012-06-18T06:14:40.590 回答
4

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

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

C# 6 中引入的字符串插值使这一点比其他方式更清晰。

于 2018-07-31T12:00:40.517 回答