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

在这个问题的标题中键入让我想到了这个问题。 我正在寻找相同的东西,但是如果你明白我的意思,那么可能不是静态格式化的东西?

我正在编写一个快速程序,它将持续两个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

谢谢,
扎克

PS我也碰到过“PrettyTime.NET”,但它输出的内容类似“3天前”等。我在google上发现的每一个其他主题都将格式化为持续时间字符串,就像上面的例子一样,这让我转向了基于Java的解决方案。 :


更新2014-09-08:

为了在3年后进行跟进,我在NuGet和Github上发现了一个名为“Humanizer”的可靠库,它可以解决我遇到的这个问题。 我没有用过那么多,但我确实尝试过,而且效果很好。 虽然它是一个相当大的图书馆(它发出了不同文化的大量文件夹到你的项目的构建路径(我相信有一种方法来定制它))。


如果你关心复数化:

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

}

你可以直接输出:

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

使用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));
}
链接地址: http://www.djcxy.com/p/18509.html

上一篇: TimeSpan "pretty time" format in C#

下一篇: Change date format in a Java string