C#中的TimeSpan“漂亮时间”格式

时间:2011-03-25 21:35:21

标签: c# formatting timespan

在这个问题的标题中输入我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

谢谢,
扎克

P.S。 我还遇到了“PrettyTime.NET”,但它输出了“3天前”等内容。我在google上找到的其他主题格式化时间字符串,就像上面的例子一样,这使我得到了一个基于Java的解决方案。 :\


更新2014-09-08:

在3年后进行跟进,我在NuGet和Github上找到了一个很棒的库,名为“Humanizer”,这将解决我遇到的这个问题。我没有那么多使用它,但我确实尝试了它并且它的工作非常好。它虽然是一个相当大的库(它为你的项目的构建路径发出了不同文化的大量文件夹(我确信有一种方法可以自定义它)。)

3 个答案:

答案 0 :(得分:32)

如果你关心多元化:

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 :(得分:9)

您可以直接输出:

 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);
}

答案 2 :(得分:1)

使用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));
}