Форматирование отрицательного TimeSpan
Я делаю некоторую математику с Timespans в .Net, и иногда сумма приводит к отрицательной 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")
но я надеялся сделать то же самое, используя только строку формата.
Ответы
Ответ 1
Я использовал .Net Reflector в TimeSpan.ToString(...), и это действительно не похоже на то, что он поддерживает любую форму отрицательного префикса в пользовательских форматах - так что я думаю, что вам не повезло, когда оно приходит чтобы заставить его работать для вас, как указано выше.: (
Ответ 2
Кажется, что вы застряли в этом коде, но если это так, кажется, замечательное время для написания метода 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()
Ответ 3
Я согласен с Волей. MSDN и Reflector показывают, что вам не повезло. Лучшее, что вы получите, это либо использовать то, что у вас есть, либо написать свой собственный IFormatProvider, либо использовать один из стандартных форматов для временных интервалов, например "g".
Ответ 4
Стандартный формат "c" предоставляет отрицательный знак, но включает все части времени.
Dim ts As New TimeSpan(-10, 1, 2)
Debug.WriteLine(ts.ToString("c"))
Ответ 5
Я использую этот надежный код:
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);
}
Надеюсь, что это поможет!
Ответ 6
Основываясь на ответе @ho1, я создал метод расширения. Возможно, сейчас будет немного проще использовать.
public static class TimeSpanUtil
{
public static string HoursAndMinutes(this TimeSpan ts)
{
return (ts < TimeSpan.Zero ? "-" : "") + ts.ToString("hh:mm");
}
}