Convert seconds to hh:mm:ss,fff format in PowerShell

 ̄綄美尐妖づ 提交于 2019-12-06 19:27:04

问题


I have a string representing a time in seconds and milliseconds. I want to convert it to a string in the format "hh:mm:ss,fff".

My solution still has the flaw that hours less than 10 are shown with one decimal instead of two:

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

What is the right way to achieve this? I'm sure there is a more elegant way with -f and datetime.


回答1:


In PowerShell 4.0

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

Output: 01:56:40,679


In PowerShell 2.0

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

Output: 01:56:40,679


And to go back the other way...

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

Output: 7000.679




回答2:


You could just use the ToString method on the TimeSpan object and specify the format you want to use. Either use one of the standard timespan formats or use a custom timespan format. For example, the following custom format gives the output you want:

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

This will output

01:56:40,679

Update: Updating to provide functions working in PowerShell v2

The above solution works well in PowerShell v4, but not in v2 (since the TimeSpan.ToString(string) method wasn't added until .NET Framework 4).

In v2 I guess you'll have to either create the string manually (like you are doing in the question) or doing an ordinary ToString() and manipulate the string. I suggest the former. Here's a function which works fine for that:

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

Testing it using

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

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

Yields the following output:

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



回答3:


One line conversion :

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

return 4106.12:04:17.8640000



来源:https://stackoverflow.com/questions/21842175/convert-seconds-to-hhmmss-fff-format-in-powershell

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!