格式化负TimeSpan

32

我在 .Net 中使用 Timespan 进行一些数学计算,有时总和会得到一个负的 Timespan。当我显示结果时,我无法格式化它以包括负指示器。

Dim ts as New Timespan(-10,0,0)

ts.ToString()

这将显示“-10:00:00”,这很好,但我不想显示秒,因此尝试了这个。

ts.ToString("hh\:mm")

这将返回“10:00”,并从前面删除了“-”,这是问题的关键所在。 我目前的解决方案是:

If(ts < TimeSpan.Zero, "-", "") & ts.ToString("hh\:mm")

但我希望只使用格式化字符串来达到相同的效果。


非常奇怪。MSDN建议使用“c”格式支持此功能,但如果您在自定义格式中使用它,则会崩溃。http://msdn.microsoft.com/en-us/library/ee372286(v=vs.100).aspx - Dr. Andrew Burnett-Thompson
7个回答

16

我曾在TimeSpan.ToString(...)上使用了.Net Reflector,但它看起来并不支持任何负数前缀的自定义格式——因此当涉及到像上面那样使其工作时,我想你可能会感到非常沮丧。:(


10

看起来你被那段代码卡住了,但如果是这样的话,现在似乎是编写扩展方法的好时机,这样你就可以使代码更清晰,并且不必在多个地方重复该代码,所以可以写出类似这样的东西:

Module Extensions
    <System.Runtime.CompilerServices.Extension()> _
    Public Function HoursAndMinutes(ByVal ts As TimeSpan) As String
        Return If(ts < TimeSpan.Zero, "-", "") & ts.ToString("hh\:mm")
    End Function
End Module

然后你可以直接调用它:

ts.HoursAndMinutes()

这可能被认为是滥用扩展方法的特定格式。 - mattmc3
@mattmc3:嗯,我可能不会像这样编写一个通用库,但为了使特定项目更易读,我不会担心这个问题。 - Hans Olsson
我最终将它实现为扩展方法,所以谢谢。将答案给了Will,因为他是第一个确认无法仅使用格式化字符串完成此操作的人。可能会滥用matt,但几乎此应用程序中的每个文本框都需要以这种方式进行格式化,因此我认为在这种情况下这样做是可以的。 - Corey Downie

2
我正在使用这个丑陋的代码:
if (timeDiff.TotalSeconds < 0)
           {
               timeDiff = timeDiff.Negate();
               TimeChangeTb.Text = string.Format("-{0:D2}:{1:D2}:{2:D2}",
               timeDiff.Hours,
               timeDiff.Minutes,
               timeDiff.Seconds);
           }
           else
           {
               TimeChangeTb.Text = string.Format("{0:D2}:{1:D2}:{2:D2}",
               timeDiff.Hours,
               timeDiff.Minutes,
               timeDiff.Seconds);
           }

希望能对你有所帮助!

2

我同意Will的观点。MSDN和Reflector都表明,你没有办法了。最好的方法是要么使用已有的内容,要么编写自己的IFormatProvider,或者使用TimeSpan的标准格式之一,比如“g”。


1

标准格式"c"提供了负号,但包括时间跨度的所有部分。

    Dim ts As New TimeSpan(-10, 1, 2)
    Debug.WriteLine(ts.ToString("c"))

0

基于 @ho1 的答案,我编写了一个扩展方法。现在可能更容易使用了。

public static class TimeSpanUtil
{
    public static string HoursAndMinutes(this TimeSpan ts) 
    {
        return (ts < TimeSpan.Zero ? "-" : "") + ts.ToString("hh:mm");     
    }        
}

0

经过测试不同的方法,这是我所做的:

Public Module TimeExtensions
    <Extension>
    Public Function ToHourMinute(ByVal time As TimeSpan) As String
        Return $"{If(time < TimeSpan.Zero, "-", "")}{time:hh\:mm}"
    End Function
End Module

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接