Преобразование миллисекунд в читаемый промежуток времени - PullRequest
47 голосов
/ 03 апреля 2012

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

3 -> 3ms
1100 -> 1s 100ms
62000 -> 1m 2s
etc ..

С учетом дней, часов, минут, секунд, ...

Возможно ли использовать C#?

Ответы [ 10 ]

85 голосов
/ 03 апреля 2012

Вы можете использовать класс TimeSpan, что-то вроде этого:

TimeSpan t = TimeSpan.FromMilliseconds(ms);
string answer = string.Format("{0:D2}h:{1:D2}m:{2:D2}s:{3:D3}ms", 
                        t.Hours, 
                        t.Minutes, 
                        t.Seconds, 
                        t.Milliseconds);

Это очень похоже на эту тему, которую я только что нашел:

Как лучше всего преобразовать секунды во время (час: минуты: секунды: миллисекунды)?

19 голосов
/ 05 ноября 2014

Я знаю, что это старый, но я хотел ответить с отличным пакетом nuget.

Install-Package Humanizer

https://www.nuget.org/packages/Humanizer

https://github.com/MehdiK/Humanizer

Пример из их readme.md

TimeSpan.FromMilliseconds(1299630020).Humanize(4) => "2 weeks, 1 day, 1 hour, 30 seconds"
14 голосов
/ 03 апреля 2012

Как насчет этого?

var ts = TimeSpan.FromMilliseconds(86300000 /*whatever */);
var parts = string
                .Format("{0:D2}d:{1:D2}h:{2:D2}m:{3:D2}s:{4:D3}ms",
                    ts.Days, ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds)
                .Split(':')
                .SkipWhile(s => Regex.Match(s, @"00\w").Success) // skip zero-valued components
                .ToArray();
var result = string.Join(" ", parts); // combine the result

Console.WriteLine(result);            // prints '23h 58m 20s 000ms'
14 голосов
/ 03 апреля 2012

Вы можете использовать статический метод TimeSpan.FromMilliseconds, а также полученные TimeSpan, Days, Hours, Minutes, Seconds и Milliseconds свойства.

НоЯ сейчас занят, поэтому я оставлю вам остальное в качестве упражнения.

9 голосов
/ 03 апреля 2012

.NET 4 принимает формат в TimeSpan.Tostring().

Для других вы можете реализовать метод расширения, например

    public static string Format(this TimeSpan obj)
    {
        StringBuilder sb = new StringBuilder();
        if (obj.Hours != 0)
        {
            sb.Append(obj.Hours);
            sb.Append(" "); 
            sb.Append("hours");
            sb.Append(" ");
        }
        if (obj.Minutes != 0 || sb.Length != 0)
        {
            sb.Append(obj.Minutes);
            sb.Append(" "); 
            sb.Append("minutes");
            sb.Append(" ");
        }
        if (obj.Seconds != 0 || sb.Length != 0)
        {
            sb.Append(obj.Seconds);
            sb.Append(" "); 
            sb.Append("seconds");
            sb.Append(" ");
        }
        if (obj.Milliseconds != 0 || sb.Length != 0)
        {
            sb.Append(obj.Milliseconds);
            sb.Append(" "); 
            sb.Append("Milliseconds");
            sb.Append(" ");
        }
        if (sb.Length == 0)
        {
            sb.Append(0);
            sb.Append(" "); 
            sb.Append("Milliseconds");
        }
        return sb.ToString();
    }

и звоните как

foreach (TimeSpan span in spans)
{
    MessageBox.Show(string.Format("{0}",  span.Format()));
}
4 голосов
/ 24 марта 2016
public static string ReadableTime(int milliseconds)
{
    var parts = new List<string>();
    Action<int, string> add = (val, unit) => { if (val > 0) parts.Add(val+unit); };
    var t = TimeSpan.FromMilliseconds(milliseconds);

    add(t.Days, "d");
    add(t.Hours, "h");
    add(t.Minutes, "m");
    add(t.Seconds, "s");
    add(t.Milliseconds, "ms");

    return string.Join(" ", parts);
}
1 голос
/ 23 мая 2019

Возможно, результат немного отличается от запрошенного, но результат понятен человеку, и его можно адаптировать для многих других случаев использования.

private static List<double> _intervals = new List<double>
{
    1.0 / 1000 / 1000,
    1.0 / 1000,
    1,
    1000,
    60 * 1000,
    60 * 60 * 1000
};
private static List<string> _units = new List<string>
{
    "ns",
    "µs",
    "ms",
    "s",
    "min",
    "h"
};

public string FormatUnits(double milliseconds, string format = "#.#")
{
    var interval = _intervals.Last(i=>i<=milliseconds);
    var index = _intervals.IndexOf(interval);

    return string.Concat((milliseconds / interval).ToString(format) , " " , _units[index]);
}

Пример звонков ...

Console.WriteLine(FormatUnits(1));
Console.WriteLine(FormatUnits(20));
Console.WriteLine(FormatUnits(300));
Console.WriteLine(FormatUnits(4000));
Console.WriteLine(FormatUnits(50000));
Console.WriteLine(FormatUnits(600000));
Console.WriteLine(FormatUnits(7000000));
Console.WriteLine(FormatUnits(80000000));

... и результаты:

1000 µs
20 ms
300 ms
4 s
50 s
10 min
1.9 h
22.2 h
1 голос
/ 22 февраля 2016

Например, чтобы получить 00:01:35.0090000 как 0 часов, 1 минут, 35 секунд и 9 миллисекунд, вы можете использовать это:

Console.WriteLine("Time elapsed:" +TimeSpan.FromMilliseconds(numberOfMilliseconds).ToString());

Ваш вывод:

Time elapsed: 00:01:35.0090000
1 голос
/ 03 апреля 2012

Может как то так?

DateTime.Now.ToString("%d 'd' %h 'h' %m 'm' %s 'seconds' %ms 'ms'")
0 голосов
/ 28 сентября 2015

Ну, я обычно ненавижу писать заявления, но иногда у тебя есть гвоздь и молоток.

string time;
if (elapsedTime.TotalMinutes > 2)
    time = string.Format("{0:n2} minutes", elapsedTime.TotalMinutes);
else if (elapsedTime.TotalSeconds > 15)
    time = string.Format("{0:n2} seconds", elapsedTime.TotalSeconds);
else
    time = string.Format("{0:n0}ms", elapsedTime.TotalMilliseconds);
...