TimeSpan ToString格式

Axi*_*ili 92 .net c#

只是好奇,是否有一个格式字符串,我可以用来输出类似"5h 3m 30s"的东西?

例如.(显然错了)

myTimeSpan.ToString("hh mm ss")
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 141

尝试:

myTimeSpan.ToString("h'h 'm'm 's's'")
Run Code Online (Sandbox Code Playgroud)

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

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

编辑:如上所述,这将超过24小时.另请注意,Noda Time也提供替代方案:)

  • 请参阅Dimension的答案,因为这个将无法正确格式化24小时或更长时间. (5认同)

Dim*_*ion 34

使用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();
Run Code Online (Sandbox Code Playgroud)

你得到这样的结果:

23h 24m 2s
3h 24m 2s
Run Code Online (Sandbox Code Playgroud)

小时格式最多可显示23小时.它不会显示27小时或将12天转换为小时,它只会将它们切断,就好像它们从未存在过一样.

解决这个问题的一种方法是创建检查时间跨度的长度和格式基础上产生,如果时间跨度超过一年,一天,ECT的延伸.或者你可以简单地总是显示日子,因为他们从未切断过:

string newFormat = span.ToString("d'd 'h'h 'm'm 's's'");
Run Code Online (Sandbox Code Playgroud)

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

但我认为这种格式正在实现其预期的功能.你只需要知道它.因此这篇文章.Jon Skeet的回答从未表明此格式仅显示日期类型格式的小时属性,其中小时数最多为23.

  • 这就是你在TimeSpan中拥有"TotalHours"等原因的原因.你可能想要这个`Math.Floor(span.TotalHours)+ span.ToString("'h'm'm's'')` (13认同)

Hol*_*olf 16

如果你不幸不使用.NET4:

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

  • 对于需要支持> 24h的代码,即使在较新版本的.net中,使用`TotalHours`的解决方案仍然是可行的. (8认同)

Jon*_*ved 8

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

timespan.ToString("hh':'mm':'ss");
Run Code Online (Sandbox Code Playgroud)

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


Joh*_*Woo 6

如何关于concactenation:

String oTime = myTimeSpan.ToString("h") + "h " +
               myTimeSpan.ToString("m") + "m " +
               myTimeSpan.ToString("s") + "s "
Run Code Online (Sandbox Code Playgroud)

更新1:

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

  • 如果您要使用连接,您可以使用IMO的"Hours","Minutes","Seconds"属性.在弄清楚报价之后,我个人宁愿使用自定义格式字符串. (11认同)

Gil*_*les 6

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

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

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


zam*_*dar 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;
Run Code Online (Sandbox Code Playgroud)

对于时间跨度解析的依据