【问题标题】:C# + Format TimeSpanC# + 格式化时间跨度
【发布时间】:2019-04-23 17:57:32
【问题描述】:

我正在尝试以“[分钟]:[秒]”的格式格式化 TimeSpan 元素。在这种格式中,2 分 8 秒看起来像“02:08”。我已经尝试了使用 String.Format 和 ToString 方法的各种选项,但我得到了一个 FormatException。这是我目前正在尝试的:

DateTime startTime = DateTime.Now;
// Do Stuff
TimeSpan duration = DateTime.Now.Subtract(startTime);

Console.WriteLine("[paragraph of information] Total Duration: " + duration.ToString("mm:ss"));

我做错了什么?如何使用我想要的格式格式化 TimeSpan 元素?

【问题讨论】:

标签: c#


【解决方案1】:

注意:此答案仅适用于 .NET 4.0。

冒号是文字,需要用单引号括起来:

duration.ToString("mm':'ss")

来自MSDN documentation

自定义TimeSpan 格式说明符 不包括占位符分隔符 符号,例如 将天与小时分开,小时与 从小数开始的分钟或秒 秒。相反,这些符号必须 包含在自定义格式中 字符串作为字符串文字。

【讨论】:

  • 对我不起作用...我认为问题在于 TimeSpan,对于 DateTime 它可以工作
  • TimeSpan 没有 ToString(string) 方法。
  • 这个答案真的很糟糕,值得两次(到目前为止)否决吗? OP 没有指定他们使用的 .NET 版本,如果他们的代码完全编译,那么他们必须使用 .NET4。 (而且他们的代码必须正在编译,否则他们将如何在运行时看到FormatException?)
  • 我没有投反对票,但由于您的解释,您刚刚获得了我的支持 - 不知道它在 4.0 中有效。顺便说一句:代码也在 3.5 中编译。但是结果是错误的(“00:00:00”)
  • @LukeH 4.0 中很好的解决方案;如果答案被标记为适用于 4.0+(确实如此),则否决投票是不合适的。我在接受的答案中添加了注释,以便其他人可以找到此解决方案。鉴于家庭TimeSpan.ToString(...) 在 4.0 中工作的特性,这实际上是一个非常好的答案。我对此投了赞成票。
【解决方案2】:

试试这个:

Console.WriteLine("{0:D2}:{1:D2}", duration.Minutes, duration.Seconds);

【讨论】:

  • 哦,你在我写答案的时候发帖了 :)
  • 这不太正确,时间分隔符是文化敏感字符串,可在 CultureInfo.DateTimeFormat.TimeSeparator 中找到。或者使用 DateTime.ToString() 方法。
  • @nobugz:感谢您提供宝贵的信息。 OP 明确要求这种特定格式。
  • @ahmad:只是提醒无数程序员有一天会在谷歌上搜索这个答案。
  • 这里有另一个答案,它显示了 .NET 4.0 中可用的新 ToString() 语法:duration.ToString("mm':'ss")(文字 : 在格式说明符中引用。)请参阅@LukeH 的答案以获取更多信息详情。
【解决方案3】:

.Net 4 中添加了 System.TimeSpan 的自定义格式,因此您现在可以执行以下操作:

string.Format("{0:mm\\:ss}", myTimeSpan);

(UPDATE) 下面是一个使用 C# 6 字符串插值的示例:

$"{myTimeSpan:hh\\:mm\\:ss}"; //example output 15:36:15

简而言之,您现在需要使用“\”转义“:”字符(除非您使用逐字字符串,否则必须对其本身进行转义)。

MSDN Custom TimeSpan Format Strings 页面的这段摘录解释了如何转义“:”和“.”。格式字符串中的字符:

自定义 TimeSpan 格式说明符不包含占位符分隔符,例如将天与小时、小时与分钟或秒与小数秒分开的符号。相反,这些符号必须作为字符串文字包含在自定义格式字符串中。例如,“dd.hh:mm”将句点 (.) 定义为天和小时之间的分隔符,将冒号 (:) 定义为小时和分钟之间的分隔符。

【讨论】:

  • 很难找到没有使用.ToString()的例子
  • 我想知道哪个 M$ 开发人员在他无限的智慧中认为为 DateTimeTimeSpan 结构设置不同的格式规则是个好主意?特别是,如果你考虑到你从前者的减法中得到后者。
【解决方案4】:

由于某种神秘的原因,直到 .NET 4.0,TimeSpan 才获得支持格式化的 ToString() 重载。对于早期版本,只要是正数,就可以劫持 DateTime.ToString():

TimeSpan ts = new TimeSpan(0, 2, 8);
string s = new DateTime(ts.Ticks).ToString("mm:ss");

【讨论】:

    【解决方案5】:

    日期和时间格式字符串仅适用于 DateTime 和 DateTimeOffset。不过,你可以使用普通格式的字符串:

    string.Format("{0}:{1:00}", Math.Truncate(duration.TotalMinutes), duration.Seconds)
    

    请注意,此处使用 TotalMinutes 可确保在耗时超过 60 分钟时结果仍然正确。

    【讨论】:

      【解决方案6】:

      试试这个:

      DateTime startTime = DateTime.Now;
      // Do Stuff
      TimeSpan duration = DateTime.Now.Subtract(startTime);
      
      Console.WriteLine("[paragraph of information] Total Duration: " + duration.Minutes.ToString("00") + ":" + duration.Seconds.ToString("00"));
      

      【讨论】:

        【解决方案7】:

        基于描述 TimeSpan 的 ToString 方法的 MSDN 页面,我有点惊讶您甚至可以编译上面的代码。 TimeSpan 没有只接受一个字符串的 ToString() 重载。

        The article 还显示了一个您可以复制并用于格式化 TimeSpan 的函数。

        【讨论】:

        • 如果 OP 使用 .NET4,则代码​​将编译,但随后会按照他们的描述运行 FormatException
        【解决方案8】:

        你总是可以这样做的:

        string.Format("{0}:{1}", duration.Minutes, duration.Seconds);
        

        【讨论】:

        • 使用空格式字符串会是一个不错的空结果 ;-)
        • @Joel:而且您甚至都懒得编辑您的答案并更正它?哇,你好勇敢! ;)
        • @Robert Koritnik:你意识到这个答案已经有一年多了,对吧?我想我会为了您的利益而对其进行编辑,这样您就不必向上滚动并查看更好的解决方案。
        • @Joel:这只是一年后的观察。 @Joey 在你回答的同一天告诉你这个问题。令我惊讶的不是没有人告诉你,也不是你没有看到。没关系。
        • 是的,我不知道为什么我在进行编辑时没有费心去修复它。我只是很困惑为什么有人会在一年后提出它。
        【解决方案9】:

        您可以使用以下代码。

        TimeSpan tSpan = TimeSpan.FromSeconds(allTotalInMinutes);
        string tTime = string.Format("{1:D2}:{2:D2}", tSpan.Minutes, tSpan.Seconds);
        

        它将显示 ie 34:45 格式。

        希望对你有帮助。

        【讨论】:

          【解决方案10】:
          TimeSpan t = TimeSpan.Parse("13:45:43");
          Console.WriteLine(@"Timespan is {0}", String.Format(@"{0:yy\:MM\:dd\:hh\:mm\:ss}", t));
          

          【讨论】:

          • -1:您的代码抛出FormatException,因为TimeSpan 中没有年或月的概念。此外,调用String.Format 是不必要的,因为Console.WriteLine 支持复合格式。 MSDN: custom TimeSpan format.
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-11
          • 1970-01-01
          • 1970-01-01
          • 2010-10-24
          • 2012-06-16
          • 1970-01-01
          相关资源
          最近更新 更多