【问题标题】:TimeSpan "pretty time" format in C#C# 中的 TimeSpan“漂亮时间”格式
【发布时间】:2011-03-25 21:35:21
【问题描述】:

输入此问题的标题将我带到this question。我正在寻找同样的东西,但如果你明白我的意思,可能不是静态格式的东西?

我正在编写一个快速程序,它将获取两个 DateTime 对象的 TimeSpan 持续时间并将它们输出以打印到纸上。

首选格式是:XX days, YY hours, ZZ minutes(秒数无关紧要;天数也是如此,因为我预计时间跨度不会超过几个小时)。

说出下面的代码(作为例子):

DateTime start = DateTime.Now;
DateTime end = DateTime.Now.AddMinutes(135);
TimeSpan duration = (end - start);

// output duration as XX hours, YY minutes

谢谢,
扎克

附: 我也遇到过“PrettyTime.NET”,但它会输出“3 天前”等内容。我在 google 上找到的所有其他主题都可以像上面的例子一样格式化持续时间字符串,这让我找到了一个基于 Java 的解决方案。 :\


2014-09-08 更新:

3 年后跟进,我在 NuGet 和 Github 上找到了一个很棒的库,名为“Humanizer”,它可以解决我遇到的这个问题。我没怎么用过,但我试过了,效果很好。虽然它是一个相当大的库(它会为您的项目的构建路径发出大量不同文化的文件夹(我确信有一种方法可以自定义它)。

【问题讨论】:

  • 发布指向 Java 版本的链接...应该可以在 C# 中实现 :)
  • @MattC:这需要我几分钟。我已经关闭了它们。 ://
  • @MattC:嗯。这是一个相似的,但格式不同的。反正一般都一样。 stackoverflow.com/questions/3471397/…
  • Zack:仅供参考 - 您可以直接使用:TimeSpan.FromMinutes(135),而不是仅仅为了制作时间跨度而制作结束日期时间:msdn.microsoft.com/en-us/library/…

标签: c# formatting timespan


【解决方案1】:

如果你关心复数:

public static string ToPrettyFormat(this TimeSpan span) {

    if (span == TimeSpan.Zero) return "0 minutes";

    var sb = new StringBuilder();
    if (span.Days > 0)
        sb.AppendFormat("{0} day{1} ", span.Days, span.Days > 1 ? "s" : String.Empty);
    if (span.Hours > 0)
        sb.AppendFormat("{0} hour{1} ", span.Hours, span.Hours > 1 ? "s" : String.Empty);
    if (span.Minutes > 0)
        sb.AppendFormat("{0} minute{1} ", span.Minutes, span.Minutes > 1 ? "s" : String.Empty);
    return sb.ToString();

}

【讨论】:

  • 啊。看起来不错。 +1 感谢所有在这里发布答案的人。 ;)
  • 这将切断尾随空格:sb.Remove(sb.Length - 1, 1);
  • 对于任何考虑这一点的人,上面的代码中有一个错误。如果持续时间大于零秒但小于 1 分钟,则它通过TimeSpan.Zero 检查但随后返回一个空字符串。您需要在返回 sb 之前评估 span.Seconds
【解决方案2】:

你可以直接输出这个:

 string result = string.Format("{0} days, {1} hours, {2} minutes", duration.Days, duration.Hours, duration.Minutes);

如果您要处理“短”时间,并且希望它更干净,您可以执行以下操作:

public string PrettyFormatTimeSpan(TimeSpan span)
{
    if (span.Days > 0)
         return string.Format("{0} days, {1} hours, {2} minutes", span.Days, span.Hours, span.Minutes);
    if (span.Hours > 0)
         return string.Format("{0} hours, {1} minutes", span.Hours, span.Minutes);

    return  string.Format("{0} minutes", span.Minutes);
}

【讨论】:

    【解决方案3】:

    使用 C# 7:

    string FormatTimeSpan(TimeSpan timeSpan)
    {
        string FormatPart(int quantity, string name) => quantity > 0 ? $"{quantity} {name}{(quantity > 1 ? "s" : "")}" : null;
        return string.Join(", ", new[] { FormatPart(timeSpan.Days, "day"), FormatPart(timeSpan.Hours, "hour"), FormatPart(timeSpan.Minutes, "minute") }.Where(x => x != null));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-29
      • 2017-06-30
      • 2019-04-02
      • 2013-01-20
      • 2013-09-23
      • 2017-08-24
      • 1970-01-01
      相关资源
      最近更新 更多