Как отформатировать TimeSpan для часов, а не дней - PullRequest
9 голосов
/ 18 апреля 2011

следующий код

Console.WriteLine("{0:%h} hours {0:%m} minutes", 
                   new TimeSpan(TimeSpan.TicksPerDay));

производит этот вывод:

0 часов 0 минут

Что бы я хотел, это вывод:

24 часа 0 минут

Чего мне не хватает в этой строке формата?

P.S. Я знаю, что мог бы вручную увеличить TimeSpan на дни и часы и умножить их на два, но предпочел бы использовать строку нестандартного формата, так как эти временные интервалы отображаются в сетке данных Silverlight, и люди ожидают увидеть гору, а не дни.

Ответы [ 2 ]

13 голосов
/ 18 апреля 2011

Согласно MSDN , использование %h покажет вам

Количество целых часов в интервале времени, когда не учитывается как часть дней .

Я думаю, вам нужно использовать свойство TotalHours класса TimeSpan, например:

TimeSpan day= new TimeSpan(TimeSpan.TicksPerDay);
Console.WriteLine("{0} hours {1} minutes", (int)day.TotalHours, day.Minutes);

Обновление

Если вам абсолютно необходимо достичь указанного формата путем передачи пользовательских форматеров в метод ToString, вам, вероятно, потребуется создать собственный класс CustomTimeSpan. К сожалению, вы не можете наследовать от struct, поэтому вам придется строить его с нуля.

10 голосов
/ 18 апреля 2011

Похоже, что нет варианта форматирования для получения общего количества часов из TimeSpan.Лучше всего вместо этого использовать свойство TotalHours:

var mySpan = new TimeSpan(TimeSpan.TicksPerDay);
Console.WriteLine("{0} hours {1} minutes", (int)mySpan.TotalHours, mySpan.Minutes);

TotalHours возвращает двойное число, поскольку оно включает дробные часы, поэтому вам нужно усечь его только доцелая часть.

...