Форматирование отрицательного времени - PullRequest
25 голосов
/ 11 июля 2010

Я делаю некоторую математику с промежутками времени в .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")

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

Ответы [ 6 ]

14 голосов
/ 11 июля 2010

Я использовал .Net Reflector для TimeSpan.ToString (...), и на самом деле не похоже, что он поддерживает какую-либо форму отрицательного префикса в пользовательских форматах - поэтому я думаю, что вам не повезет, когда это произойдет чтобы заставить его работать на вас, как указано выше. (

8 голосов
/ 11 июля 2010

Кажется, что вы застряли с этим кодом, но если это так, кажется, что это прекрасное время для написания метода расширения, таким образом вы можете сделать свой код более понятным, и вам не нужно повторять этот код несколько раз. места, так что-то вроде:

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 голосов
/ 11 июля 2010

Я согласен с Уиллом. MSDN и Reflector показывают, что вам не повезло. Лучшее, что вы можете получить, это либо использовать то, что у вас есть, написать собственный IFormatProvider, либо использовать один из стандартных форматов для временного интервала, например «g».

1 голос
/ 24 сентября 2013

Я использую этот беспорядочный код:

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);
           }

Надеюсь, это поможет!

1 голос
/ 12 июля 2010

Стандартный формат "c" обеспечивает отрицательный знак, но включает в себя все части временного интервала.

0 голосов
/ 15 июля 2014

На основе ответа @ ho1 я создал метод расширения. В наше время может быть немного проще в использовании.

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