Відповіді:
Спробуйте:
myTimeSpan.ToString("h'h 'm'm 's's'")
(Зауважте, що навіть пробіли потрібно цитувати - ось що було не так у моїй першій спробі.)
Я припускаю, що ви, звичайно, використовуєте .NET 4 - до цього TimeSpanне підтримували рядки власного формату.
EDIT: Як зазначалося, це працює не більше 24 годин. Також зауважте, що альтернативи також доступні через Noda Time :)
Будьте в курсі цього, використовуючи відповідь Джона Скіта, з таким кодом:
// 12 days, 23 hours, 24 minutes, 2 seconds.
TimeSpan span = new TimeSpan(12, 23, 24, 2);
// 27 hours, 24 minutes, 2 seconds
TimeSpan span2 = new TimeSpan(27,24,2);
string format = span.ToString("h'h 'm'm 's's'");
string format2 = span2.ToString("h'h 'm'm 's's'");
Console.WriteLine(format);
Console.WriteLine(format2);
Console.ReadLine();
Ви отримуєте такі результати:
23h 24m 2s
3h 24m 2s
Формат годин може максимум показувати 23 години. Він не буде показувати 27 годин або перетворить 12 днів на години, він просто відріже їх так, ніби їх ніколи не було.
Одним із способів виправити це було б створення розширення, яке перевіряє тривалість часового інтервалу та створює форматування на основі, якщо часовий проміжок перевищує рік, день тощо. Або ви можете просто завжди показувати дні, тому що вони ніколи не відсікають:
string newFormat = span.ToString("d'd 'h'h 'm'm 's's'");
Зверніть увагу, я початківець з програмування. Це випливає з спостережень лише після того, як мені пощастило помітити це, припустивши, що воно відображатиметься всі години. Я говорю це, тому що не знаю, чи є краще рішення, як-от ще один годинний формат, який може відображати нескінченні години.
Однак я думаю, що цей формат виконує призначені для нього функції. Ви просто повинні це знати. Таким чином ця посада. Відповідь Джона Скіта ніколи не вказувала, що цей формат повинен відображати лише властивість години формату типу дати, де годин може бути не більше 23.
TotalHoursі т.д. в TimeSpan. Ви, напевно, цього хотілиMath.Floor(span.TotalHours) + span.ToString("'h 'm'm 's's'")
Якщо вам пощастило не використовувати .NET4:
string.Format("{0}h{1}m{2}s",
myTimeSpan.Hours,
myTimeSpan.Minutes,
myTimeSpan.Seconds);
TotalHoursдосі залишається способом навіть у нових версіях .net.
TotalHours, як це є, а doubleне intподібне Hours, тобто воно покаже частки годин, а також цілі години.
як щодо запікання:
String oTime = myTimeSpan.ToString("h") + "h " +
myTimeSpan.ToString("m") + "m " +
myTimeSpan.ToString("s") + "s "
ОНОВЛЕННЯ 1:
Ви можете уникнути цього за допомогою однієї цитати: h'h 'm'm 's's'
Hours, Minutes, Secondsвластивість ІМО. Я особисто скоріше використовую рядок у користувальницькому форматі після з'ясування котирування.
Цей маленький код допомагає для синтаксичного аналізу та зворотного повернення:
var t = TimeSpan.FromMilliseconds(450780);
double d1 = t.TotalSeconds;
string t3 = t.ToString(@"hh\:mm\:ss\.f",null);
var tt = TimeSpan.ParseExact(t3, @"hh\:mm\:ss\.f",null);
double d2 = tt.TotalSeconds;
Використовуючи, Xamarinі .NET Portable 4.5це був єдиний формат, який я отримав, працюючи після випробування всіх інших відповідей тут:
timespan.ToString("hh':'mm':'ss");
По суті, я вкладаю :єдині цитати, щоб уникнути їх.
Я іноді знаходжу рядки формату трохи схожими на регулярні вирази, тому що, повертаючись до коду пізніше, я забув нюанси. Тому я пішов із наступним, що рідше поверне мені документацію:
string FormatTimeSpan(TimeSpan timeSpan) =>
$"{Math.Floor(timeSpan.TotalHours)}h {timeSpan.Minutes}m {timeSpan.Seconds}s";
Інтерполяція рядків, введена в C # 6, робить це набагато зрозумілішим, ніж було б інакше.