Используйте 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);

Но это также не работает с тех пор, как истекло. Миллисекунды возвращают 500 как целое число.

17
задан Jürgen Steinblock 4 April 2016 в 05:57
поделиться

5 ответов

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

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

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

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

4
ответ дан 30 November 2019 в 11:59
поделиться

Я рассмотрел несколько способов сделать это, но, к сожалению, получил уродливый ответ. Вы не можете использовать 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
2
ответ дан 30 November 2019 в 11:59
поделиться

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

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

// 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
-5
ответ дан 30 November 2019 в 11:59
поделиться

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

В вашем коде это будет выглядеть так:

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

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

13
ответ дан 30 November 2019 в 11:59
поделиться

Хм, это неприятно (как выяснилось) - по крайней мере, до .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

1
ответ дан 30 November 2019 в 11:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: