【问题标题】:TimeSpan ToString formatTimeSpan ToString 格式
【发布时间】:2012-06-18 06:12:23
【问题描述】:

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

例如。 (显然是错误的)

myTimeSpan.ToString("hh mm ss")

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    试试:

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

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

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

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

    【讨论】:

    • 查看 Dimension 的答案,因为这个答案不能正确格式化 24 小时或更长的时间。
    • "dd'd 'hh'h 'mm'm'" - 这对我有用。考虑到您需要用撇号包装格式化文本:“dd'days花费'”。这里 dd 是数据的和平和“你自己的文本所花费的天数”
    【解决方案2】:

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

    【讨论】:

    • 这就是为什么你在 TimeSpan 中有 TotalHours 等。你可能想要这个Math.Floor(span.TotalHours) + span.ToString("'h 'm'm 's's'")
    【解决方案3】:

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

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

    【讨论】:

    • 对于需要支持 >24h 的代码,即使在较新版本的 .net 中,这个带有TotalHours 的解决方案仍然是可行的方法。
    • 我觉得这个更好,因为你可以信任它。
    • 小心使用TotalHours,因为那是double,而不是像Hours 那样的int,即它会显示小时数和整个小时数。
    【解决方案4】:

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

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

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

    【讨论】:

      【解决方案5】:

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

      参考:Custom TimeSpan format strings

      【讨论】:

        【解决方案6】:

        串联怎么样:

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

        更新 1:

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

        【讨论】:

        • 如果你要使用连接,你不妨使用HoursMinutesSeconds 属性 IMO。在弄清楚引用之后,我个人宁愿使用自定义格式字符串。
        【解决方案7】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-12
          • 2013-04-04
          • 1970-01-01
          • 2019-10-23
          • 2016-07-04
          • 2013-04-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多