Формат ToString TimeSpan


95

Цікаво, чи є рядок формату, який я можу використовувати для виведення чогось типу "5h 3m 30s"?

напр. (очевидно неправильно)

myTimeSpan.ToString("hh mm ss")

Відповіді:


143

Спробуйте:

myTimeSpan.ToString("h'h 'm'm 's's'")

(Зауважте, що навіть пробіли потрібно цитувати - ось що було не так у моїй першій спробі.)

Я припускаю, що ви, звичайно, використовуєте .NET 4 - до цього TimeSpanне підтримували рядки власного формату.

EDIT: Як зазначалося, це працює не більше 24 годин. Також зауважте, що альтернативи також доступні через Noda Time :)


5
Дивіться відповідь Dimension, тому що цей не буде правильно форматувати час, який не перевищує 24 години.
Скотт

"dd'd 'hh'h' mm'm" "- це працює для мене. Візьміть до уваги, що вам потрібно обгортати ваш відформатований текст апострофами: "dd'днів проведено '". Тут dd - це спокій даних і "дні, витрачені" на ваш власний текст "
Павло Шклейник

37

Будьте в курсі цього, використовуючи відповідь Джона Скіта, з таким кодом:

// 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.


14
Ось чому у вас є TotalHoursі т.д. в TimeSpan. Ви, напевно, цього хотілиMath.Floor(span.TotalHours) + span.ToString("'h 'm'm 's's'")
Аксімілі

17

Якщо вам пощастило не використовувати .NET4:

string.Format("{0}h{1}m{2}s",
    myTimeSpan.Hours,
    myTimeSpan.Minutes,
    myTimeSpan.Seconds);

9
Що стосується коду, який потребує підтримки> 24 години, це рішення з TotalHoursдосі залишається способом навіть у нових версіях .net.
CodesInChaos

1
Я насправді вважаю це кращим, оскільки ви можете просто довіряти цьому.
Кріс Марісіч

Будьте обережні, якщо ви використовуєте TotalHours, як це є, а doubleне intподібне Hours, тобто воно покаже частки годин, а також цілі години.
Джінлі

6

як щодо запікання:

String oTime = myTimeSpan.ToString("h") + "h " +
               myTimeSpan.ToString("m") + "m " +
               myTimeSpan.ToString("s") + "s "

ОНОВЛЕННЯ 1:

Ви можете уникнути цього за допомогою однієї цитати: h'h 'm'm 's's'


11
Якщо ви збираєтеся використовувати конкатенацію, ви можете також використовувати Hours, Minutes, Secondsвластивість ІМО. Я особисто скоріше використовую рядок у користувальницькому форматі після з'ясування котирування.
Джон Скіт


5

Використовуючи, Xamarinі .NET Portable 4.5це був єдиний формат, який я отримав, працюючи після випробування всіх інших відповідей тут:

timespan.ToString("hh':'mm':'ss");

По суті, я вкладаю :єдині цитати, щоб уникнути їх.


2

Я іноді знаходжу рядки формату трохи схожими на регулярні вирази, тому що, повертаючись до коду пізніше, я забув нюанси. Тому я пішов із наступним, що рідше поверне мені документацію:

string FormatTimeSpan(TimeSpan timeSpan) =>
    $"{Math.Floor(timeSpan.TotalHours)}h {timeSpan.Minutes}m {timeSpan.Seconds}s";

Інтерполяція рядків, введена в C # 6, робить це набагато зрозумілішим, ніж було б інакше.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.