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.
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
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