Используйте string.format на Timepan для вывода полных секунд без миллисекунды

StackOverflow https://stackoverflow.com/questions/3545508

  •  30-09-2019
  •  | 
  •  

Вопрос

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

Допустим, у меня есть следующий код:

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);

Но это тоже не работает, так как Seltaped.miliseconds возвращает 500 как целое число.

Это было полезно?

Решение

Изменить

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

к

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

.NET 4 позволяет использовать пользовательские строки формата с TimeSpan. Вы можете найти полную ссылку на доступные спецификаторы формата в MSDN Пользовательские строки формата TimeSpan страница.

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

Этот выдержка из MSDN Пользовательские строки формата TimeSpan Страница объясняет о том, чтобы избежать «:» и «». символы в строке формата:

Пользовательские спецификаторы формата TimeSpan не включают символы сепаратора заполнителя, такие как символы, которые отделяют несколько дней с часов, часов с минуты, или секунды от дробных секунд. Вместо этого эти символы должны быть включены в строку пользовательской формата в виде строковых литералов. Например, «DD.HH: MM» определяет период (.) В качестве сепаратора между днями и часами, а толстой кишки (:) в качестве сепаратора между часами и минутами.

Другие советы

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

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

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

ОБНОВИТЬ: Это относится к .NET 3.5 и ранее, .NET 4 делает поддержку форматирования временных пространств.

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

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

Чтобы получить формат, который вы хотите.

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

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

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

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

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

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

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

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

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

Есть следующие пользовательские спецификаторы формата Y (года), M (месяц), d (день), h (час 12), h (час 24), м (минута), 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top