web-dev-qa-db-fra.com

Convertissez les secondes au format hh: mm: ss, fff dans PowerShell

J'ai une chaîne représentant un temps en secondes et millisecondes. Je veux le convertir en une chaîne au format "hh: mm: ss, fff".

Ma solution a toujours le défaut que les heures inférieures à 10 apparaissent avec une décimale au lieu de deux:

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

Quel est le bon moyen d'y parvenir? Je suis sûr qu'il existe un moyen plus élégant avec -f et datetime.

10
nixda

Dans PowerShell 4.0

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

Sortie: 01:56:40,679


Dans PowerShell 2.0

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

Sortie: 01:56:40,679


Et pour revenir en arrière ...

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

Sortie: 7000.679

22
andyb

Vous pouvez simplement utiliser la méthode ToString sur l'objet TimeSpan et spécifier le format que vous souhaitez utiliser. Utilisez l’un des formats de plage horaire standard ou un format de plage horaire personnalisé . Par exemple, le format personnalisé suivant donne le résultat souhaité:

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

Cela produira

01:56:40,679

Update: mise à jour pour fournir des fonctions fonctionnant dans PowerShell v2

La solution ci-dessus fonctionne bien dans PowerShell v4, mais pas dans la v2 (car la méthode TimeSpan.ToString(string) n'a pas été ajoutée jusqu'à .NET Framework 4).

En v2, je suppose que vous devrez soit créer la chaîne manuellement (comme vous le faites dans la question), soit créer une ToString() ordinaire et manipuler la chaîne. Je suggère le premier. Voici une fonction qui fonctionne bien pour cela:

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

Le tester en utilisant

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

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

Donne la sortie suivante: 

01:56:40,679
01:56:40,679
9
Robert Westerlund