Подтвердить что ты не робот

Форматирование отрицательного 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")

но я надеялся сделать то же самое, используя только строку формата.

4b9b3361

Ответ 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");     
    }        
}