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

后端 未结 3 810
一向
一向 2021-01-04 01:46

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

相关标签:
3条回答
  • 2021-01-04 02:24

    One line conversion :

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

    return 4106.12:04:17.8640000

    0 讨论(0)
  • 2021-01-04 02:31

    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

    0 讨论(0)
  • 2021-01-04 02:37

    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
    
    0 讨论(0)
提交回复
热议问题