356 Stimmen

Wie kann ich Sekunden in (Stunde:Minute:Sekunde:Millisekunde) Zeit umwandeln?

Wie kann ich Sekunden in (Stunde:Minute:Sekunde:Millisekunde) Zeit konvertieren?

Angenommen, ich habe 80 Sekunden; gibt es spezialisierte Klassen/Techniken in .NET, die es mir ermöglichen, diese 80 Sekunden in das Format (00h:00m:00s:00ms) wie Convert.ToDateTime oder etwas Ähnliches umzuwandeln?

690voto

Curtis Shipley Punkte 7652

Für .Net <= 4.0 verwenden Sie die TimeSpan-Klasse.

TimeSpan t = TimeSpan.FromSeconds( secs );

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

(Wie von Inder Kumar Rathore erwähnt) Für .NET > 4.0 können Sie verwenden

TimeSpan time = TimeSpan.FromSeconds(seconds);

//hier ist der Backslash erforderlich, um zu zeigen, dass der Doppelpunkt nicht Teil des Formats ist, sondern nur ein Zeichen, das im Output erscheinen soll
string str = time .ToString(@"hh\:mm\:ss\:fff");

(Von Nick Molyneux) Stellen Sie sicher, dass seconds kleiner als TimeSpan.MaxValue.TotalSeconds ist, um eine Ausnahme zu vermeiden.

0 Stimmen

Verwenden von System; Die Klasse befindet sich in System.TimeSpan.

99voto

Inder Kumar Rathore Punkte 38280

Für .NET > 4.0 können Sie verwenden

Zeitspanne zeit = TimeSpan.FromSeconds(sekunden);

//hier ist der Backslash erforderlich, um zu zeigen, dass der Doppelpunkt kein Teil des Formats ist,
// sondern nur ein Zeichen, das wir im Ausgabetext haben möchten
string str = zeit.ToString(@"hh\:mm\:ss\:fff");

oder wenn Sie das Datumszeitenformat wünschen, können Sie auch dies tun

Zeitspanne zeit = TimeSpan.FromSeconds(sekunden);
DateTime datumZeit = DateTime.Today.Add(zeit);
string anzeigeZeit = datumZeit.ToString("hh:mm:tt");

Weitere Informationen finden Sie unter Benutzerdefinierte TimeSpan-Formatzeichenfolgen

2 Stimmen

Sie benötigen keine TimeSpan, um Sekunden zu DateTime hinzuzufügen. Verwenden Sie einfach DateTime.AddSeconds().

0 Stimmen

@MehdiDehghani für das 24-Stunden-Format musst du anstelle von 'hh' 'HH' verwenden

0 Stimmen

@InderKumarRathore Ich sprach von deiner ersten Lösung, HH ist dort ungültig.

29voto

Jim Mischel Punkte 125706

Wenn Sie wissen, dass Sie eine Anzahl von Sekunden haben, können Sie einen TimeSpan-Wert erstellen, indem Sie TimeSpan.FromSeconds aufrufen:

 TimeSpan ts = TimeSpan.FromSeconds(80);

Sie können dann die Anzahl der Tage, Stunden, Minuten oder Sekunden erhalten. oder verwenden Sie eine der ToString-Überlastungen, um sie in der von Ihnen gewünschten Weise auszugeben.

26voto

Andrew Punkte 6990

Ich habe einige Benchmarks durchgeführt, um herauszufinden, was der schnellste Weg ist, und dies sind meine Ergebnisse und Schlussfolgerungen. Ich habe jede Methode 10M Mal ausgeführt und einen Kommentar mit der durchschnittlichen Laufzeit pro Durchlauf hinzugefügt.

Wenn Ihre Eingabemillisekunden nicht auf einen Tag begrenzt sind (Ihr Ergebnis kann 143:59:59.999 sein), sind dies die Optionen, von schneller zu langsamer:

// 0.86 ms
static string Method1(int millisecs)
{
    int hours = millisecs / 3600000;
    int mins = (millisecs % 3600000) / 60000;
    // Stellen Sie sicher, dass Sie den geeigneten Dezimaltrenner verwenden
    return string.Format("{0:D2}:{1:D2}:{2:D2}.{3:D3}", hours, mins, millisecs % 60000 / 1000, millisecs % 1000);
}

// 0.89 ms
static string Method2(int millisecs)
{
    double s = millisecs % 60000 / 1000.0;
    millisecs /= 60000;
    int mins = millisecs % 60;
    int hours = millisecs / 60;
    return string.Format("{0:D2}:{1:D2}:{2:00.000}", hours, mins, s);
}

// 0.95 ms
static string Method3(int millisecs)
{
    TimeSpan t = TimeSpan.FromMilliseconds(millisecs);
    // Stellen Sie sicher, dass Sie den geeigneten Dezimaltrenner verwenden
    return string.Format("{0:D2}:{1:D2}:{2:D2}.{3:D3}",
        (int)t.TotalHours,
        t.Minutes,
        t.Seconds,
        t.Milliseconds);
}

Wenn Ihre Eingabemillisekunden auf einen Tag begrenzt sind (Ihr Ergebnis wird nie größer als 23:59:59.999 sein), sind dies die Optionen, von schneller zu langsamer:

// 0.58 ms
static string Method5(int millisecs)
{
    // Schnellster Weg, um ein DateTime um Mitternacht zu erstellen
    // Stellen Sie sicher, dass Sie den geeigneten Dezimaltrenner verwenden
    return DateTime.FromBinary(599266080000000000).AddMilliseconds(millisecs).ToString("HH:mm:ss.fff");
}

// 0.59 ms
static string Method4(int millisecs)
{
    // Stellen Sie sicher, dass Sie den geeigneten Dezimaltrenner verwenden
    return TimeSpan.FromMilliseconds(millisecs).ToString(@"hh\:mm\:ss\.fff");
}

// 0.93 ms
static string Method6(int millisecs)
{
    TimeSpan t = TimeSpan.FromMilliseconds(millisecs);
    // Stellen Sie sicher, dass Sie den geeigneten Dezimaltrenner verwenden
    return string.Format("{0:D2}:{1:D2}:{2:D2}.{3:D3}",
        t.Hours,
        t.Minutes,
        t.Seconds,
        t.Milliseconds);
}

Falls Ihre Eingabe nur Sekunden sind, sind die Methoden etwas schneller. Wieder, wenn Ihre Eingabesekunden nicht auf einen Tag begrenzt sind (Ihr Ergebnis kann 143:59:59 sein):

// 0.63 ms
static string Method1(int secs)
{
    int hours = secs / 3600;
    int mins = (secs % 3600) / 60;
    secs = secs % 60;
    return string.Format("{0:D2}:{1:D2}:{2:D2}", hours, mins, secs);
}

// 0.64 ms
static string Method2(int secs)
{
    int s = secs % 60;
    secs /= 60;
    int mins = secs % 60;
    int hours = secs / 60;
    return string.Format("{0:D2}:{1:D2}:{2:D2}", hours, mins, s);
}

// 0.70 ms
static string Method3(int secs)
{
    TimeSpan t = TimeSpan.FromSeconds(secs);
    return string.Format("{0:D2}:{1:D2}:{2:D2}",
        (int)t.TotalHours,
        t.Minutes,
        t.Seconds);
}

Und wenn Ihre Eingabesekunden auf einen Tag begrenzt sind (Ihr Ergebnis wird nie größer als 23:59:59 sein):

// 0.33 ms
static string Method5(int secs)
{
    // Schnellster Weg, um ein DateTime um Mitternacht zu erstellen
    return DateTime.FromBinary(599266080000000000).AddSeconds(secs).ToString("HH:mm:ss");
}

// 0.34 ms
static string Method4(int secs)
{
    return TimeSpan.FromSeconds(secs).ToString(@"hh\:mm\:ss");
}

// 0.70 ms
static string Method6(int secs)
{
    TimeSpan t = TimeSpan.FromSeconds(secs);
    return string.Format("{0:D2}:{1:D2}:{2:D2}",
        t.Hours,
        t.Minutes,
        t.Seconds);
}

Als abschließende Anmerkung möchte ich hinzufügen, dass ich festgestellt habe, dass string.Format etwas schneller ist, wenn Sie D2 anstelle von 00 verwenden.

11voto

toad Punkte 1353

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X