Заменить символы двоеточия или точки в формате времени на заданное слово

169
26 июня 2019, 23:40

Подскажите, можно ли во времени, например: 01:00:05 типа DateTime или TimeSpan заменить двоеточия на сокращения ч, мин или сек и при этом убрать нули до первого значащего числа? Возможно ли это сделать функциями .net, дабы не писать свой парсер?

Вот что это означает: например у нас есть строка 00:01:00, на экране увидим 1m00s. Я бы хотел чтобы было 1мин00сек

Вот пример как вместо двоеточия использовать другие символы h, m или s:

TimeSpan ts = new TimeSpan(00, 01, 00);
string s = ts.ToString(@"d\d\h\hmm\mss\s").TrimStart(' ', 'd', 'h', 'm', 's', '0');
Answer 1

вроде должно быть все понятно по коду

var a = DateTime.Now.ToString("yyyy лет MM месяцев dd  дней hh часов mm минут ss секунд");

Результат:

2018 лет 12 месяцев 20 дней 04 часов 51 минут 21 секунд

  • MM - Месяц с предшествующим нулем
  • M - просто месяц без нулей
  • dd - с ну нулем
  • d - без нулей
  • yyyy - 4-символьный год
  • yy - 2-хсимвольный год
  • HH - 24часовый формат часов с предшествующим нулем
  • H - 24часовый формат без предшествующим нуля
  • hh - 12часовый формат часов с предшествующим нулем
  • h - 12часовый формат часов без нуля
  • mm - минут с предшествующим нулем
  • m - без нуля
  • ss - секунды с предшествующим нулем
  • s - секунды без предшествующего нуля.

.

дальше просто логика обрезания начала строки.

То есть тебе нужно что-то вроде метода:

public static class DateTimeExtension
{
    public static string ToCustomDateStr(this DateTime dt)
    {
        string str;
        if (dt.Hour != 0)
        {
            str = dt.ToString("Hчас mмин sсек");
        }
        else
        {
            str = dt.ToString("mмин sсек");
        }
        return str;
    }
}

и использование:

var a = DateTime.Now.ToCustomDateStr();

результат будет...

17час 56мин 36сек

или

56мин 36сек

или

6час 56мин 36сек

Answer 2

Если брать за основу, что начальная строка не содержит ошибок, то:

var sep = new [] {"ч","мин","сек"};
var t = string.Join(" ", "03:01:00"
    .Split(':')
    .Select((s, i) => s == "00" ? string.Empty : $"{int.Parse(s)}{sep[i]}")
    .Where(s => !string.IsNullOrEmpty(s)));
Answer 3

Для типа TimeSpan придумал вот такой конвертер (если не хочется использовать DateTime. В моём случае работать с DateTime мне было не удобно):

public static string ToCustomDateStr(TimeSpan ts)
        {
            string str;
            string parseString = ts.ToString(@"d\.h\:m\:s").TrimStart(' ', 'd', 'h', 'm', 's', '0', '.', ':');
            string[] duration = parseString.Split('.', ':');
            if (duration.Length == 1)
                str = ts.Seconds.ToString() + "sec";
            else if (duration.Length == 2)
                str = ts.Minutes.ToString() + "min " + ts.Seconds.ToString() + "sec";
            else if (duration.Length == 3)
                str = ts.Hours.ToString() + "h " + ts.Minutes.ToString() + "min " + ts.Seconds.ToString() + "sec";
            else if (duration.Length == 4)
                str = ts.Days.ToString() + "d " + ts.Hours.ToString() + "h " + ts.Minutes.ToString() + "min " + ts.Seconds.ToString() + "sec";
            else
                str = string.Empty;
            return str;    
        }

Я делаю строку вида день.часы:минуты:секунды, затем разбиваю её и формирую новую в зависимости от того, сколько данных получилось после разбиения.

READ ALSO
Навигация в xamarin forms

Навигация в xamarin forms

Вопрос заключается в следующемСоздаю приложение на xamarin forms, используя паттерн mvvm

178
selenium web driver C# ожидание

selenium web driver C# ожидание

надо сделать ожидание пока элемент прогрузится но выдает ошибку на drManage()

131
Два массива, второй зависим от первого

Два массива, второй зависим от первого

У меня есть массив int [] lvl, который можно менять количество элементов и значения через Inspector в ЮнитиНужно создать второй массив int[] keys, Length которого...

135