TimeSpan ToString格式

时间:2012-06-18 06:12:24

标签: c# .net

好奇,我可以使用格式字符串输出类似“5h 3m 30s”的内容吗?

例如。 (显然是错的)

myTimeSpan.ToString("hh mm ss")

7 个答案:

答案 0 :(得分:135)

尝试:

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

(请注意,甚至需要引用空格 - 这是我第一次尝试的错误。)

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

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

答案 1 :(得分:32)

使用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。

答案 2 :(得分:16)

如果你不幸使用.NET4:

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

答案 3 :(得分:6)

如何进行连接:

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

更新1:

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

答案 4 :(得分:5)

这个小代码有助于解析和反向:

        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;

Referance for timespan parse

答案 5 :(得分:4)

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

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

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

答案 6 :(得分:0)

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

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

在C#6中引入的字符串插值使它比以前更加清晰。