Используйте String.Format на TimeSpan для вывода полных секунд без миллисекунд

Я хочу отобразить прошедшее время между двумя датами в строке.

Скажем, у меня есть следующий код:

DateTime date1 = DateTime.Now();
System.Threading.Thread.Sleep(2500);
DateTime date2 = DateTime.Now();

TimeSpan elapsed = date2.substract(date1);
Console.WriteLine("> {0:hh:mm:ss}", elapsed);

Что я ожидаю:

> 00:00:03

Что я получаю:

> 00:00:02.5002500

Есть ли способ использовать функцию String.Format, чтобы возвращать только полные секунды?
Я также попытался удалить десятичные знаки с помощью:

elapsed = elapsed.Substract(TimeSpan.FromMiliseconds((double)Timespan.Miliseconds);

Но это не работает ни с момента, когда прошло .Millseconds возвращает 500 как Integer.

Ответы

Ответ 1

Измените

Console.WriteLine("> {0:hh:mm:ss}", elapsed);

to

Console.WriteLine("> {0:hh\\:mm\\:ss}", elapsed);

.Net 4 позволяет использовать строки пользовательского формата с Timespan. Вы можете найти полное описание доступных спецификаторов формата на странице MSDN Custom TimeSpan Format Strings.

Вам нужно избежать символа ":" с "\" (который сам должен быть экранирован, если вы не используете строку в виде строки).

В этой выдержке из страницы MSDN Custom TimeSpan Format Strings рассказывается об экранировании ":" и ".". символов в строке формата:

Пользовательские спецификации формата TimeSpan не включают символы разделителя заполнителей, такие как символы, которые отделяют дни от часов, часов от минут или секунд от дробных секунд. Вместо этого эти символы должны быть включены в строку пользовательского формата в виде строковых литералов. Например, "dd.hh: mm" определяет период (.) Как разделитель между днями и часами и двоеточие (:) как разделитель между часами и минутами.

Ответ 2

К сожалению, невозможно форматировать TimeSpan так же, как значение DateTime. Однако вы можете сделать быстрое преобразование, так как TimeSpan и DateTime сохраняют свое значение как тики (в свойстве Ticks).

В коде, который будет выглядеть так:

Console.WriteLine("> {0:hh:mm:ss}", new DateTime(elapsed.Ticks));

ОБНОВЛЕНИЕ:. Это относится к .NET 3.5 и более ранним версиям .NET 4 поддерживает форматирование TimeSpans.

Ответ 3

Класс TimeSpan имеет свойства Hours, Minutes и Seconds, которые возвращают каждую деталь отдельно. Поэтому вы можете попробовать:

String.Format(CultureInfo.CurrentCulture, "{0}:{1}:{2}", 
    elapsed.Hours, 
    elapsed.Minutes, 
    elapsed.Seconds)

Чтобы получить желаемый формат.

Может быть более оптимальный способ, но я еще не нашел его.

Ответ 4

Посмотрев на несколько способов сделать это, я, к сожалению, остался с уродливым ответом. Вы не можете использовать Ticks, так как он не возвращает формат правильно, но будет работать следующее:

DateTime date1 = DateTime.Now;
System.Threading.Thread.Sleep(2500);
DateTime date2 = DateTime.Now;

TimeSpan elapsed = date2.Subtract(date1);

string[] Split = elapsed.ToString().Split('.');

string m = Split[0]; // Returns 00:00:02

Ответ 5

Хм, это неприятно (как выясняется) - по крайней мере до .NET 4.0

Если вы перейдете сюда: http://msdn.microsoft.com/en-us/library/1ecy8h51(v=VS.90).aspx, он скажет вам, что нет перегрузки формата для периода времени и что вам нужно сделать это вручную, например:

     span.Hours.ToString("00") + ":" + 
     span.Minutes.ToString("00") + ":" + 
     span.Seconds.ToString("00") + "."

Это появляется - по крайней мере, из документации - для исправления в .NET 4.0

Ответ 6

вы можете сделать это:

dt.Subtract(TimeSpan.FromMilliseconds(dt.Millisecond)).ToString();

Ответ 7

Существуют следующие спецификаторы специальных форматов y (год), M (месяц), d (день), h (час 12), H (час 24), m (минута), s (второй), f (вторая доля), F (вторая часть, конечные нули обрезаны), t (PM или AM) и z (часовой пояс).

В следующих примерах показано, как спецификаторы формата переписываются на выходе. [С#]

// create date time 2008-03-09 16:05:07.123    
DateTime dt = new DateTime(2008, 3, 9, 16, 5, 7, 123);    
String.Format("{0:y yy yyy yyyy}", dt);  // "8 08 008 2008"   year    
String.Format("{0:M MM MMM MMMM}", dt);  // "3 03 Mar March"  month    
String.Format("{0:d dd ddd dddd}", dt);  // "9 09 Sun Sunday" day    
String.Format("{0:h hh H HH}",     dt);  // "4 04 16 16"      hour 12/24
String.Format("{0:m mm}",          dt);  // "5 05"            minute
String.Format("{0:s ss}",          dt);  // "7 07"            second    
String.Format("{0:f ff fff ffff}", dt);  // "1 12 123 1230"   sec.fraction    
String.Format("{0:F FF FFF FFFF}", dt);  // "1 12 123 123"    without zeroes    
String.Format("{0:t tt}",          dt);  // "P PM"            A.M. or P.M.    
String.Format("{0:z zz zzz}",      dt);  // "-6 -06 -06:00"   time zone