29

我正在用.Net 中的时间跨度做一些数学运算,有时总和会导致时间跨度为负。当我显示结果时,我无法将其格式化为包含负面指示符。

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")

但我希望只使用格式字符串来完成同样的任务。

4

7 回答 7

15

我在 TimeSpan.ToString(...) 上使用了.Net Reflector,它看起来确实不支持自定义格式的任何形式的负前缀 - 所以我认为你在获得它时不走运如上所述为您工作。:(

于 2010-07-11T17:33:00.637 回答
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()
于 2010-07-11T18:02:05.467 回答
2

我同意威尔。MSDN 和 Reflector 都表明你运气不好。您将获得的最好的结果是使用您所拥有的,编写您自己的 IFormatProvider,或者使用一种标准的时间跨度格式,例如“g”。

于 2010-07-11T17:45:52.807 回答
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);
           }

希望能帮助到你!

于 2013-09-24T13:28:51.200 回答
1

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

    Dim ts As New TimeSpan(-10, 1, 2)
    Debug.WriteLine(ts.ToString("c"))
于 2010-07-12T11:29:44.610 回答
0

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

public static class TimeSpanUtil
{
    public static string HoursAndMinutes(this TimeSpan ts) 
    {
        return (ts < TimeSpan.Zero ? "-" : "") + ts.ToString("hh:mm");     
    }        
}
于 2014-07-15T08:12:04.420 回答
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
于 2020-12-03T18:56:22.600 回答