web-dev-qa-db-fra.com

Convertir des millisecondes en un laps de temps lisible par l'homme

Je voudrais formater certains temps d'exécution des commandes dans un format lisible par l'homme, par exemple:

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

Prise en compte des jours, heures, minutes, secondes, ...

Est-il possible d'utiliser C#?

49
Daniel Peñalba

Vous pouvez utiliser la classe TimeSpan, quelque chose comme ceci:

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

Il est assez similaire à ce fil que je viens de trouver:

Quelle est la meilleure façon de convertir les secondes en (heure: minutes: secondes: millisecondes)?

89
walther

Je sais que c'est vieux, mais je voulais répondre avec un excellent paquet de pépites.

Install-Package Humanizer

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

https://github.com/MehdiK/Humanizer

Exemple de leur readme.md

TimeSpan.FromMilliseconds(1299630020).Humanize(4) => "2 weeks, 1 day, 1 hour, 30 seconds"
19
Ian Becker

Vous pouvez utiliser la méthode statique TimeSpan.FromMilliseconds Ainsi que les TimeSpan résultants Days, Hours, Minutes, Seconds et Milliseconds propriétés.

Mais je suis occupé en ce moment, je vais donc vous laisser le reste comme exercice.

14
Nuffin

Et ça?

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
Igor Korkhov

.NET 4 accepte le format dans TimeSpan.Tostring().

Pour d'autres, vous pouvez implémenter une méthode d'extension comme

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

et appeler comme

foreach (TimeSpan span in spans)
{
    MessageBox.Show(string.Format("{0}",  span.Format()));
}
9
hungryMind
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);
}
4
Sedat Gokalp

Peut-être quelque chose comme ça?

DateTime.Now.ToString("%d 'd' %h 'h' %m 'm' %s 'seconds' %ms 'ms'")
1
Arion

Par exemple, pour obtenir 00:01:35.0090000 comme 0 heures, 1 minutes, 35 secondes et 9 millisecondes, vous pouvez utiliser ceci:

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

Votre sortie:

Time elapsed: 00:01:35.0090000
1
Hassen Ch.

Cela a probablement une sortie légèrement différente de celle demandée, mais le résultat est lisible par l'homme - et il peut être adapté pour s'adapter à de nombreux autres cas d'utilisation.

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

Exemples d'appels ...

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

... et résultats:

1000 µs
20 ms
300 ms
4 s
50 s
10 min
1.9 h
22.2 h
1
mike

Eh bien, je déteste normalement écrire des déclarations, mais parfois ce que vous avez vraiment est un clou et j'ai besoin d'un marteau.

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);
0
Chris Marisic