Преобразование секунд в формат hh: mm:ss, FFF в PowerShell

у меня есть строка, которая представляет время в секундах и миллисекундах. Я хочу преобразовать его в строку в формате "hh:mm: ss,fff".

мое решение по-прежнему имеет недостаток, что часы менее 10 отображаются с одним десятичным знаком вместо двух:

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

каков правильный способ достичь этого? Я уверен, что есть более элегантный способ с -f и datetime.

3 ответов


В PowerShell 4.0

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

выход: 01:56:40,679


В PowerShell 2.0

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

выход: 01:56:40,679


и вернуться в другую сторону...

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

выход: 7000.679


вы можете просто использовать ToString метод для объекта TimeSpan и укажите формат, который вы хотите использовать. Либо используйте один из стандартные форматы timespan или использовать пользовательский формат timespan. Например, следующий пользовательский формат дает желаемый результат:

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

это позволит вывести

01:56:40,679

Update: обновление для предоставления функций, работающих в PowerShell v2

вышеуказанное решение работает хорошо в PowerShell v4, но не в v2 (начиная с TimeSpan.ToString(string) метод не был добавлен до .NET Framework 4).

в v2 я думаю, вам придется либо создать строку вручную (как вы делаете в вопросе), либо сделать обычный ToString() и манипулировать строкой. Я предлагаю первое. Вот функция, которая отлично работает для этого:

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

тестирование с помощью

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

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

дает следующий результат:

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

преобразование одной строки:

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

возвращение 4106.12:04:17.8640000