我正在使用.Net中的Timespans进行一些数学运算,偶尔总结会产生负时间跨度。当我显示结果时,我无法格式化它以包含否定指示符。
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")
但我希望通过仅使用格式字符串来实现相同目的。
答案 0 :(得分:14)
我在TimeSpan.ToString(...)上使用了.Net Reflector,看起来它看起来不像自定义格式支持任何形式的负前缀 - 所以我觉得你运气不好如上所述让它为你工作。 :(
答案 1 :(得分:8)
好像你已经坚持使用该代码,但如果是这样,这似乎是编写extesion方法的好时机,这样你就可以使你的代码更清晰,而且你不必在多个代码中重复这些代码地方,所以像:
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()
答案 2 :(得分:2)
我同意威尔。 MSDN和Reflector都表明你运气不好。你要做的最好的事情就是使用你拥有的东西,编写自己的IFormatProvider,或者使用其中一种标准格式作为“g”的时间跨度。
答案 3 :(得分:1)
标准格式“c”提供负号,但包括时间跨度的所有部分。
Dim ts As New TimeSpan(-10, 1, 2)
Debug.WriteLine(ts.ToString("c"))
答案 4 :(得分:1)
我正在使用这个很难看的代码:
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);
}
希望它有所帮助!
答案 5 :(得分:0)
根据@ ho1的答案,我建立了一个扩展方法。现在可能会更容易使用。
public static class TimeSpanUtil
{
public static string HoursAndMinutes(this TimeSpan ts)
{
return (ts < TimeSpan.Zero ? "-" : "") + ts.ToString("hh:mm");
}
}
答案 6 :(得分: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