从时间中删除前导零以显示已用时间

时间:2011-03-22 21:47:06

标签: c# formatting timespan

我需要显示经过时间跨度的最简单版本。有没有准备好的事情呢?

样品:

HH:mm:ss
10:43:27 > 10h43m27s
00:04:12 > 4m12s
00:00:07 > 7s

我想我需要一个格式提供程序来消磨时间。

5 个答案:

答案 0 :(得分:9)

简单的扩展方法应该足够了:

static class Extensions
{ 
    public static string ToShortForm(this TimeSpan t)
    {
        string shortForm = "";
        if (t.Hours > 0)
        {
            shortForm += string.Format("{0}h", t.Hours.ToString());
        }
        if (t.Minutes > 0)
        {
            shortForm += string.Format("{0}m", t.Minutes.ToString());
        }
        if (t.Seconds > 0)
        {
            shortForm += string.Format("{0}s", t.Seconds.ToString());
        }
        return shortForm;
    } 
} 

用以下方法测试:

TimeSpan tsTest = new TimeSpan(10, 43, 27);
string output = tsTest.ToShortForm();
tsTest = new TimeSpan(0, 4, 12);
output = tsTest.ToShortForm();
tsTest = new TimeSpan(0, 0, 7);
output = tsTest.ToShortForm();

答案 1 :(得分:8)

这是一个单行(几乎),假设你有TimeSpan objectL

(new TimeSpan(0, 0, 30, 21, 3))
  .ToString(@"d\d\ hh\hmm\mss\s")
  .TrimStart(' ','d','h','m','s','0');

示例代码输出

30m21s

为了示例,第一行只创建了一个TimeSpan对象,.ToString按照您要求的格式对其进行格式化,然后.TrimStart删除您不喜欢的主要字符不需要。

答案 2 :(得分:3)

我不认为这可以通过简单的方式完成自定义格式序列化程序 - 我只是自己编写:

TimeSpan delta = TimeSpan.Parse("09:03:07");
string displayTime = string.Empty;
if (delta.Hours > 0)
    displayTime += delta.Hours.ToString() + "h";

if (delta.Minutes > 0)
    displayTime += delta.Minutes.ToString() + "m";

if (delta.Seconds > 0)
    displayTime += delta.Seconds.ToString() + "s";

请注意,这仅适用于正时间跨度。

答案 3 :(得分:1)

您可以使用string.Format来实现此目的,以及一些条件语句:

public static string GetSimplestTimeSpan(TimeSpan timeSpan)
{
    var result = string.Empty;
    if (timeSpan.Days > 0)
    {
        result += string.Format(
            @"{0:ddd\d}", timeSpan).TrimStart('0');
    }
    if (timeSpan.Hours > 0)
    {
        result += string.Format(
            @"{0:hh\h}", timeSpan).TrimStart('0');
    }
    if (timeSpan.Minutes > 0)
    {
        result += string.Format(
            @"{0:mm\m}", timeSpan).TrimStart('0');
    }
    if (timeSpan.Seconds > 0)
    {
        result += string.Format(
            @"{0:ss\s}", timeSpan).TrimStart('0');
    }
    return result;
}

虽然看到BrokenGlass的答案,我很想说在这里使用Format是有点矫枉过正。但是,它允许您根据需要调整经过时间跨度的每个元素的输出。

答案 4 :(得分:1)

这是我的看法:

    Dim TimeTaken As String = TimeSpan.ToString("g") ' Supply TimeSpan
    If TimeTaken.Contains("0:00") Then
        TimeTaken = TimeTaken.Remove(0, 3)
    ElseIf TimeTaken.Contains("0:0") Then
        TimeTaken = TimeTaken.Remove(0, 2)
    End If