webentwicklung-frage-antwort-db.com.de

Konvertieren Sie Sekunden in hh: mm: ss, fff-Format in PowerShell

Ich habe eine Zeichenfolge, die eine Zeit in Sekunden und Millisekunden darstellt. Ich möchte es in eine Zeichenfolge im Format "hh: mm: ss, fff" konvertieren.

Meine Lösung hat immer noch den Fehler, dass Stunden, die kleiner als 10 sind, mit einer Dezimalstelle anstelle von zwei angezeigt werden:

PS> $secs = "7000.6789"
PS> $ts =  [timespan]::fromseconds($s)
PS> $res = "$($ts.hours):$($ts.minutes):$($ts.seconds),$($ts.milliseconds)"
PS> $res
PS> 1:56:40,679

Was ist der richtige Weg, um dies zu erreichen? Ich bin sicher, dass es mit -f und datetime einen eleganteren Weg gibt.

10
nixda

In PowerShell 4.0

$s = "7000.6789"
$ts =  [timespan]::fromseconds($s)
("{0:HH\:mm\:ss\,fff}" -f $ts)

Ausgabe: 01:56:40,679


In PowerShell 2.0

$s = "7000.6789"
$ts =  [timespan]::fromseconds($s)
"{0:HH:mm:ss,fff}" -f ([datetime]$ts.Ticks)

Ausgabe: 01:56:40,679


Und zurück in die andere Richtung gehen ...

$text = "01:56:40,679"
$textReformat = $text -replace ",","."
$seconds = ([TimeSpan]::Parse($textReformat)).TotalSeconds
$seconds

Ausgabe: 7000.679

22
andyb

Sie können einfach die ToString-Methode für das TimeSpan-Objekt verwenden und das gewünschte Format angeben. Verwenden Sie entweder eines der Standard-Zeitbereichsformate oder verwenden Sie ein benutzerdefiniertes Zeitbereichsformat . Das folgende benutzerdefinierte Format liefert beispielsweise die gewünschte Ausgabe:

$ts =  [timespan]::fromseconds("7000.6789")
$ts.ToString("hh\:mm\:ss\,fff")

Dies wird ausgegeben

01:56:40,679

Update: Aktualisierung, um Funktionen bereitzustellen, die in PowerShell v2 funktionieren

Die obige Lösung funktioniert gut in PowerShell v4, jedoch nicht in v2 (da die TimeSpan.ToString(string)-Methode erst in .NET Framework 4 hinzugefügt wurde).

In Version 2 muss der String entweder manuell erstellt werden (wie in der Frage), oder Sie müssen eine normale ToString() ausführen und den String bearbeiten. Ich schlage den ersteren vor. Hier ist eine Funktion, die dafür gut funktioniert:

function Format-TimeSpan
{
    PARAM (
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [TimeSpan]$TimeSpan
    )

    #Current implementation doesn't handle days.

    #By including the delimiters in the formatting string it's easier when we contatenate in the end
    $hours = $TimeSpan.Hours.ToString("00")
    $minutes = $TimeSpan.Minutes.ToString("\:00")
    $seconds = $TimeSpan.Seconds.ToString("\:00")
    $milliseconds = $TimeSpan.Milliseconds.ToString("\,000")

    Write-Output ($hours + $minutes + $seconds + $milliseconds)
}

Testen Sie es mit

$ts =  [timespan]::fromseconds("7000.6789")

Format-TimeSpan -TimeSpan $ts
$ts | Format-TimeSpan

Ergibt folgende Ausgabe: 

01:56:40,679
01:56:40,679
9

Einzeilige Konvertierung:

[timespan]::fromseconds(354801857.86437).tostring()

rückerstattung 4106.12:04:17.8640000

1
Alban